C语言读取文件中以空格分隔的数值的代码问题咨询
解决C语言读取空格分隔数值文件的问题
先给你点出代码里的核心问题:你用fscanf的返回值和0比较是错误的逻辑。fscanf的返回值是成功读取的变量个数,当读到文件末尾(EOF)时会返回EOF(一个定义为-1的宏),而非0。如果保持原有的!=0判断,一旦遇到读取失败(比如文件里出现非数字内容,或者已经读完所有数据),程序会直接陷入死循环——因为每次fscanf都返回0,循环条件一直成立,会不停地重复输出之前读取的旧值。
修正后的代码
#include<stdio.h> int main() { FILE *fp; int x,y,t,q; // 必须检查文件是否成功打开,避免崩溃 fp = fopen("sth.xyt","r"); if (fp == NULL) { perror("Failed to open file"); return 1; } // 判断是否成功读取4个整数,这个逻辑更严谨 while (fscanf(fp,"%d %d %d %d", &x, &y, &t, &q) == 4) { printf("x=%d y=%d theta=%d quality=%d\n", x, y, t, q); } // 可以额外判断循环退出的原因,方便调试 if (feof(fp)) { printf("Reached end of file.\n"); } else { printf("Error reading file or invalid data format.\n"); } getchar(); fclose(fp); return 0; }
关键细节说明
- 文件打开检查:新增了
if (fp == NULL)的判断,避免文件不存在、权限不足等情况导致程序直接崩溃,perror会输出具体错误原因,方便你排查问题。 - 循环条件修正:用
==4判断fscanf是否成功读取了4个整数,这样既可以正常遍历所有符合格式的数值组,又能在遇到不符合格式的内容时及时停止,避免无效输出。 - 空白字符兼容:不管你的数值是每行4个还是连续排列,
fscanf会自动忽略空格、换行符等所有空白字符,所以不需要担心换行的问题,都能正确读取。
内容的提问来源于stack exchange,提问作者user1371666
相关产品推荐
相关产品推荐

