【问题标题】:C - Read file line by lineC - 逐行读取文件
【发布时间】:2019-07-26 04:25:32
【问题描述】:

代码运行良好,只是感觉还有很多错误,给我一点方向,以后可以改进。我想学习如何正确维护代码。

按应有的方式修复代码!

数据.txt

[1] Line numbers 1.
[2] Line numbers 2.
[3] Line numbers 3.
[4] Line numbers 4.
[5] Line numbers 5.
[6] Line numbers 6.

我的代码:

#include <stdio.h>
#include <stdlib.h>

int getLengthFile(char *namafile)
{
    FILE *fptr;
    int n =0;
    fptr = fopen(namafile, "r");
    if(fptr != NULL){
        char c;
        while((c = getc(fptr)) != EOF) {
            ++n;
        }
        fclose(fptr);
    }
    return n;
}

int main(){
    FILE *fptr;
    int i;
    fptr = fopen("Data.txt","r");
    if(fptr != NULL){
        printf("Succes reads file!\n");
        if(getLengthFile("Data.txt")>0){
            char strLine[225];
            while(fgets(strLine,225,fptr) != NULL){
                printf("%s",strLine);
            }
        }else{
            printf("File is empty!\n");
        }
        fclose(fptr);
    }else{
        printf("Error reads file!\n");
    }

    return 0;
}

【问题讨论】:

  • 循环 for(;fgets(strLine,225,fptr);fptr){ 中的最后一个 fptr 毫无意义。循环使用while (fgets(strLine, sizeof(strLine), fptr) != NULL) 是惯例,因为fgets() 在EOF(或任何错误)上返回一个空指针。对于显示的代码,变量fptr 应该在main() 函数中定义——它不应该是一个全局变量。尽可能避免使用全局变量。
  • 你怎么“误用了fgets()”?你的意思是你从某个地方复制了代码并且不明白你复制了什么?
  • 请注意,fclose() 调用应该在 if 的主体内。如果代码无法打开文件,fclose() 可能会崩溃,因为它不是为处理空指针而设计的。打开文件读取失败的错误信息也不是很好。
  • 你能修复代码吗,谢谢大家的回复。
  • 下次提问时,请不要发文字图片,而是以文字形式发布。

标签: c file for-loop


【解决方案1】:

这是问题第一版中提供的代码的或多或少固定版本,其中不存在 getLengthFile() 函数。在我看来,该功能不提供有用的功能。如果您必须报告该文件不包含任何数据,您可以通过计算fgets() 返回任何数据的次数来报告——如果它返回任何数据,则该文件不为空。

#include <stdio.h>

int main(void)
{
    const char filename[] = "Data.txt";
    FILE *fptr = fopen(filename, "r");
    if (fptr == NULL)
    {
        fprintf(stderr, "Error opening file %s for reading!\n", filename);
        return 1;
    }
    printf("Success opening file %s for reading\n", filename);
    char strLine[225];
    while (fgets(strLine, sizeof(strLine), fptr) != NULL)
        printf("%s", strLine);
    fclose(fptr);

    return 0;
}

当没有文件Data.txt时,示例输出为:

Error opening file Data.txt for reading!

当有一个文件包含一小行数据时,示例输出为:

Success opening file Data.txt for reading
data from the file Data.txt

我还在一个行数较长的文件上进行了测试,包括多达 380 个字符的行,程序的输出与输入相同,除了“成功打开文件 Data.txt 以供读取”这一行.

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2022-01-25
    • 2015-05-19
    相关资源
    最近更新 更多