C语言如何读取文本文件中的数组数据?如何读取多行数据?
关于C语言读取文本文件数组数据的问题解答
嘿,针对你提出的两个问题,我给你拆解下实用的解决方案:
1. 如何从文本文件读取数组形式的数据?
首先得明确你的文本文件里数组数据的存储格式——是每行一个元素,还是一行里用空格/逗号分隔多个元素?我给你两种常见场景的实现思路:
场景1:每行存储一个数组元素
比如你的文件内容是每行一个整数:15 27 33 41可以用
fscanf或者fgets配合atoi来读取,这里用fscanf更直接,示例代码如下:#include <stdio.h> #include <stdlib.h> int main() { FILE *fp = fopen("array_data.txt", "r"); if (fp == NULL) { perror("Failed to open file"); return 1; } int arr[100]; // 预设最多存100个元素,可根据需求调整 int elem_count = 0; // 循环读取直到文件结束,或者数组存满 while (fscanf(fp, "%d", &arr[elem_count]) != EOF && elem_count < 100) { elem_count++; } fclose(fp); // 验证读取结果 printf("读取到的数组元素:"); for (int i = 0; i < elem_count; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }场景2:一行内用分隔符(空格/逗号)存储多个元素
如果文件里是类似12,34,56,78或者12 34 56 78这样的格式,咱们可以先读取整行,再用strtok分割字符串转成数字:#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fp = fopen("array_data.txt", "r"); if (fp == NULL) { perror("Failed to open file"); return 1; } char line_buf[256]; int arr[100]; int elem_count = 0; // 逐行读取文件 while (fgets(line_buf, sizeof(line_buf), fp) != NULL && elem_count < 100) { // 用逗号、空格、换行符作为分割标记 char *token = strtok(line_buf, ", \n"); while (token != NULL && elem_count < 100) { arr[elem_count++] = atoi(token); token = strtok(NULL, ", \n"); } } fclose(fp); // 打印结果 printf("读取到的数组元素:"); for (int i = 0; i < elem_count; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }
2. 修改代码读取剩余99行数据
你现在的代码只能读第一行,大概率是因为只调用了一次读取函数(比如fgets或者fscanf),没加循环持续读取。咱们只需要把读取操作放进循环里,直到读完100行或者文件结束就行。
举个例子,假设你原来的代码是这样的(只读第一行):
#include <stdio.h> int main() { FILE *fp = fopen("large_nums.txt", "r"); if (fp == NULL) { perror("Open file failed"); return 1; } char line[256]; // 只调用了一次fgets,所以只能读第一行 fgets(line, sizeof(line), fp); printf("第一行数据:%s", line); fclose(fp); return 0; }
修改方案1:用fgets循环读取每行
如果需要逐行处理内容,用fgets循环最直观:
#include <stdio.h> int main() { FILE *fp = fopen("large_nums.txt", "r"); if (fp == NULL) { perror("Open file failed"); return 1; } char line[256]; int line_count = 0; // 循环读取,直到文件结束或者读完100行 while (fgets(line, sizeof(line), fp) != NULL && line_count < 100) { line_count++; printf("第%d行数据:%s", line_count, line); // 这里可以添加代码,把每行的数字解析出来存到数组里 } printf("总共读取了%d行数据\n", line_count); fclose(fp); return 0; }
修改方案2:如果每行是单个数字,用fscanf循环更高效
如果你的每行只有一个数字,fscanf会自动跳过换行符,直接读取数字,不用处理换行的问题:
#include <stdio.h> int main() { FILE *fp = fopen("large_nums.txt", "r"); if (fp == NULL) { perror("Open file failed"); return 1; } int nums[100]; int num_count = 0; // 循环读取直到文件结束,或者存满100个数字 while (fscanf(fp, "%d", &nums[num_count]) != EOF && num_count < 100) { num_count++; } printf("总共读取了%d个数字\n", num_count); // 打印所有读取到的数字 for (int i = 0; i < num_count; i++) { printf("第%d个数字:%d\n", i+1, nums[i]); } fclose(fp); return 0; }
核心思路就是:不要只调用一次读取函数,用循环持续执行读取操作,直到满足终止条件(文件读完或者拿到了你需要的100行/100个数据)。
内容的提问来源于stack exchange,提问作者SyntaxError101




