You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

修复说明

  1. 使用fgets读取整行内容到缓冲区,严格区分不同行;
  2. 用sscanf配合指针遍历缓冲区,解析每行中的所有整数;
  3. 添加了数组边界检查(i < MAX_SIZE),避免数组越界;
  4. 兼容不同风格的换行符(fgets会自动处理\n或\r\n)。

内容的提问来源于stack exchange,提问作者user1237538

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:10:54