Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中再次循环_C_Loops_Undefined Behavior_Fgets_Feof - Fatal编程技术网

在C中再次循环

在C中再次循环,c,loops,undefined-behavior,fgets,feof,C,Loops,Undefined Behavior,Fgets,Feof,我编写c程序,逐行读取文件(argv) 我的文本文件如下: 这是我的密码 #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

我编写c程序,逐行读取文件(argv)

我的文本文件如下:

这是我的密码

#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; } #包括 #包括 无效读取\u fp(文件*fp){ 字符缓冲区[50]; fgets(缓冲区,sizeof(缓冲区),fp); printf(“%s”,缓冲区); } int main(int argc,char*argv[]){ 文件*fp=fopen(argv[1],“r”); 而(1){ 如果(feof(fp))中断; 读fp(fp); } 返回0; } 或

int main(int argc,char*argv[]){ 文件*fp=fopen(argv[1],“r”); 而(!feof(fp)){ 读fp(fp); } 返回0; } 我预测我的程序打印 一 二 三 四 五 六

但这个程序实际上是打印的 一 二 三 四 五 六 六

它再次循环


为什么。。。?读取文件的最后一条记录后,如何修复此问题尚未设置条件feof(fp)

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

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

}
在这种情况下,条件满足,
fgets
的调用返回
NULL
。但是您正在输出存储在
缓冲区中的当前值,这将导致未定义的行为

您可以更改函数,例如

void read_fp(FILE *fp){
        char buffer[50];
        If ( fgets(buffer, sizeof(buffer), fp) ) printf("%s", buffer);
}
. 要检测文件结尾,请查看
fgets
返回的内容。如果
fgets
返回
NULL
,则它没有从文件中读取任何内容。
void read_fp(FILE *fp){
        char buffer[50];
        If ( fgets(buffer, sizeof(buffer), fp) ) printf("%s", buffer);
}