You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动