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
相关产品推荐
相关产品推荐

