在 C 中再次循环 [duplicate]

loop once more in C [duplicate]

提问人:skk 提问时间:4/17/2021 最后编辑:Vlad from Moscowskk 更新时间:4/17/2021 访问量:81

问:

我编写了逐行读取文件(argv1)的c程序

我的文本文件是这样的:

enter image description here

这是我的代码

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

void read_fp(FILE *fp){
        char buffer[50];
        fgets(buffer, sizeof(buffer), fp);
        printf("%s", buffer);

}


int main(int argc, char* argv[]){
        FILE* fp = fopen(argv[1], "r");
        while(1){
                if(feof(fp)) break;
                read_fp(fp);
        }
        return 0;
}

int main(int argc, char* argv[]){
        FILE* fp = fopen(argv[1], "r");
        while(!feof(fp)){
                read_fp(fp);
        }
        return 0;
}

我预测我的程序打印 一 二 三 四 五 六

但程序实际上打印 一 二 三 四 五 六 六

它再次循环

为什么。。。?我怎样才能解决这个问题

C 循环未 定义行为 fgets feof

评论

1赞 user3386109 4/17/2021
不要使用 feof。若要检测文件末尾,请查看返回的内容。如果返回 ,则它没有从文件中读取任何内容。fgetsfgetsNULL

答:

1赞 Vlad from Moscow 4/17/2021 #1

读取文件的最后一条记录后,条件尚未设置。feof( fp )

因此,在函数中,您正在尝试再次访问该文件

void read_fp(FILE *fp){
        char buffer[50];
        fgets(buffer, sizeof(buffer), fp);
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        printf("%s", buffer);

}

在这种情况下,条件得到满足,并且返回的调用。但是您输出的当前值存储在其中,这会导致未定义的行为。fgetsNULLbuffer

您可以更改功能,例如

void read_fp(FILE *fp){
        char buffer[50];
        If ( fgets(buffer, sizeof(buffer), fp) ) printf("%s", buffer);
}