fscanf无法读取文件第二行的代码问题排查请求
问题排查与修复
核心问题
你的代码无法正确读取第二行的根本原因是错误地混合使用fscanf和fgetc来区分行:
fscanf("%d")会自动跳过所有空白字符(空格、换行、制表符),无法感知行边界;- 每次读取整数后调用
fgetc检查换行的逻辑不可靠:如果一行末尾的整数后有空格(而非直接换行),fgetc读取到的是空格,不会触发break,循环会继续读取下一行的整数到array1中,导致array2没有内容; - 若文件使用Windows风格的
\r\n换行,fgetc会先读取\r,不等于'\n',同样会导致循环无法终止,继续读取下一行。
修复方案
正确的做法是先读取整行内容到缓冲区,再解析每行的整数。以下是修复后的代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 100 #define BUFFER_SIZE 1024 // 足够容纳一行内容的缓冲区 int main() { FILE *file; int array1[MAX_SIZE], array2[MAX_SIZE]; int i = 0, j = 0; char buffer[BUFFER_SIZE]; // 打开文件 file = fopen("numbers.txt", "r"); if (file == NULL) { printf("Error opening file\n"); return 1; } // 读取第一行并解析整数 if (fgets(buffer, BUFFER_SIZE, file) != NULL) { char *ptr = buffer; while (sscanf(ptr, "%d", &array1[i]) == 1 && i < MAX_SIZE) { i++; // 跳过当前整数后的空白字符,移动到下一个整数的位置 while (*ptr != '\0' && (*ptr < '0' || *ptr > '9')) { ptr++; } } } // 读取第二行并解析整数 if (fgets(buffer, BUFFER_SIZE, file) != NULL) { char *ptr = buffer; while (sscanf(ptr, "%d", &array2[j]) == 1 && j < MAX_SIZE) { j++; // 跳过当前整数后的空白字符 while (*ptr != '\0' && (*ptr < '0' || *ptr > '9')) { ptr++; } } } // 打印结果 printf("Array 1: "); for (int k = 0; k < i; k++) { printf("%d ", array1[k]); } printf("\n"); printf("Array 2: "); for (int k = 0; k < j; k++) { printf("%d ", array2[k]); } printf("\n"); fclose(file); return 0; }
修复说明
- 使用
fgets读取整行内容到缓冲区,严格区分不同行; - 用
sscanf配合指针遍历缓冲区,解析每行中的所有整数; - 添加了数组边界检查(
i < MAX_SIZE),避免数组越界; - 兼容不同风格的换行符(
fgets会自动处理\n或\r\n)。
内容的提问来源于stack exchange,提问作者user1237538
相关产品推荐
相关产品推荐

