问题 : 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;
}