Nwafu-OJ-1488 Problem r C语言实习题八——文本文件行统计

这是一个C语言编程任务,要求编写一个函数`GetLineInfo`,从文本文件中读取指定行的内容,并统计其中的大写字母、小写字母、数字、分隔符和其他字符的数量。程序首先检查文件指针是否有效,然后逐行读取文件,直到找到指定行。统计完成后,函数返回0表示成功,否则返回1。在`main`函数中,程序打开文件`test.txt`并遍历1到8行,打印每行的统计结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 : C语言实习题八——文本文件行统计

时间限制: 1 Sec  内存限制: 128 MB
提交: 4339  解决: 1145
[提交][状态][讨论版]

题目描述

请编写函数从文本文件中读取指定行的全部文字(文本文件每行字符长度不超过255),并对该行文字进行统计。
预先定义有:
typedef struct {
    int lineno;   // 文本行在文件中的行号
    int Uppers;   // 该行中大写字母字符的个数
    int Lowers;   // 该行中小写字母字符的个数
    int Numbers;  // 该行中数字字符的个数
    int Separators;//该行中英文分隔字符的个数(含空格、制表符、换行符、逗号、句号、分号等6种分隔符)
    int Others;    //该行中除以上情形外其他字符的个数
}LineInfo,*PLineInfo;
要求实现函数int GetLineInfo(FILE *fp, PLineInfo li);其中fp为要读取的文本文件指针,li中lineno域指定行号,其他域返回统计结果。若统计正常函数返回0,否则返回1.

提示

请自行参考上述代码构造调试代码及测试用文本文件test.txt

代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

typedef struct {
    int lineno;   // 文本行在文件中的行号
    int Uppers;   // 该行中大写字母字符的个数
    int Lowers;   // 该行中小写字母字符的个数
    int Numbers;  // 该行中数字字符的个数
    int Separators;//该行中英文分隔字符的个数(含空格、制表符、换行符、逗号、句号、分号等6种分隔符) // 换行符不算 ^_^。
    int Others;    //该行中除以上情形外其他字符的个数
}LineInfo, * PLineInfo;

int GetLineInfo(FILE* fp, PLineInfo li) {
    rewind(fp);
    if (fp == NULL || li->lineno < 1) {
        return 1;
    }
    char ch = 0;
    int line = li->lineno;
    li->Uppers = 0;
    li->Lowers = 0;
    li->Numbers = 0;
    li->Separators = 0;
    li->Others = 0;
    while (!feof(fp)) {
        if (line == 1) {
            break;
        }
        ch = fgetc(fp);
        if (ch == '\n') {
            line--;
        }
        if (line == 1) {
            break;
        }
    }
    if (feof(fp) || fp == NULL) {
        return 1;
    }
    while (1) {
        ch = fgetc(fp);
        if (ch == '\n') {
            break;
        }
        if ((int)ch >= (int)'A' && (int)ch <= (int)'Z') {
            li->Uppers++;
        }
        else if ((int)ch >= (int)'a' && (int)ch <= (int)'z') {
            li->Lowers++;
        }
        else if ((int)ch >= (int)'0' && (int)ch <= (int)'9') {
            li->Numbers++;
        }
        else if (ch == ' ' || ch == '\t' || ch == ',' || ch == '.' || ch == ';') {
            li->Separators++;
        }
        else
        {
            li->Others++;
        }
    }
    return 0;
}

int main() {
    FILE* fp = fopen("test.txt", "r");
    LineInfo li;
    for (int i = 1; i < 9; i++) {
        rewind(fp);
        li.lineno = i;
        GetLineInfo(fp, &li);
        printf("%d ", li.lineno);
        printf("%d ", li.Uppers);
        printf("%d ", li.Lowers);
        printf("%d ", li.Numbers);
        printf("%d ", li.Separators);
        printf("%d\n", li.Others);
    }

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值