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

C语言从文件读取整数:首行存变量其余存数组的实现问题

解决文本文件整数读取的问题

嘿,我看你现在在处理从TXT文件读取整数的需求,当前代码存在几个关键问题,我来帮你梳理并修正它~

现有代码的核心问题

  • 文件指针混乱:你把fgets和fscanf混着用了。fgets已经读取了一行内容到lineBuf,但紧接着的fscanf会从fgets读完的位置继续读取,导致首行的三个整数根本没被正确解析到变量里。
  • 逻辑重复执行:你把读取首行的逻辑放在了while循环内,这意味着每循环一次都会尝试读取三个整数,而实际上首行只需要读取一次,剩下的行才需要循环读取单个整数。

修正后的代码实现

下面是更可靠的实现方案,分步骤处理首行和后续内容:

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

int main() {
    // 打开文件,先检查是否成功
    FILE *inputFile = fopen("your_input.txt", "r");
    if (inputFile == NULL) {
        perror("Failed to open input file");
        return 1;
    }

    int pages, frames, requests;
    // 读取首行的三个整数,同时验证读取结果
    if (fscanf(inputFile, "%d %d %d", &pages, &frames, &requests) != 3) {
        printf("Error: Failed to parse first line\n");
        fclose(inputFile);
        return 1;
    }
    printf("First line variables:\n Pages: %d\n Frames: %d\n Total requests: %d\n", pages, frames, requests);

    // 根据请求数动态分配数组(避免固定大小的内存浪费)
    int *requestArray = malloc(requests * sizeof(int));
    if (requestArray == NULL) {
        perror("Failed to allocate memory for request array");
        fclose(inputFile);
        return 1;
    }

    // 循环读取剩余的每个整数,存入数组
    int i;
    for (i = 0; i < requests; i++) {
        if (fscanf(inputFile, "%d", &requestArray[i]) != 1) {
            printf("Error: Failed to read request at index %d\n", i);
            free(requestArray);
            fclose(inputFile);
            return 1;
        }
    }

    // 可选:验证数组内容
    printf("\nRequest array content:\n");
    for (i = 0; i < requests; i++) {
        printf("%d ", requestArray[i]);
    }
    printf("\n");

    // 清理资源,避免内存泄漏和文件句柄占用
    free(requestArray);
    fclose(inputFile);
    return 0;
}

额外优化建议(更安全的首行解析)

如果担心首行存在多余字符或格式异常,可以用fgets先读取整行,再用sscanf解析,避免文件指针偏移问题:

char lineBuf[256];
// 读取首行内容
if (fgets(lineBuf, sizeof(lineBuf), inputFile) == NULL) {
    printf("Error: Failed to read first line\n");
    fclose(inputFile);
    return 1;
}
// 解析首行的三个整数
if (sscanf(lineBuf, "%d %d %d", &pages, &frames, &requests) != 3) {
    printf("Error: Invalid format in first line\n");
    fclose(inputFile);
    return 1;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:48:06