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

如何在C语言中逐行读取文件并检查每行是否为整数?

嘿,我来帮你搞定这个问题!你现在的代码用fscanf直接读整数,但它会自动跳过空白(包括换行、空格),根本做不到逐行检查——比如如果某一行里混了字母或者符号,或者整行根本不是数字,fscanf的处理逻辑会完全不符合你的预期。下面给你两种靠谱的实现方式,优先推荐第一种:

方法1:用fgets读取整行,再用strtol验证整数

这是最稳妥的方案,fgets能保证每次读取一整行内容(直到换行符),然后我们用strtol解析整数的同时,还能检查该行有没有多余的无效字符,甚至能处理整数溢出的情况。

代码示例:

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

int main() {
    FILE *fp = fopen("users.txt", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    char line[256]; // 可以根据你的文件行长度调整缓冲区大小
    while (fgets(line, sizeof(line), fp) != NULL) {
        // 先去掉行尾的换行符(如果存在)
        size_t len = strlen(line);
        if (len > 0 && line[len - 1] == '\n') {
            line[len - 1] = '\0';
        }

        errno = 0; // 重置错误标志,用来检测溢出
        char *endptr;
        long id = strtol(line, &endptr, 10); // 10表示解析十进制整数

        // 分情况验证是否为有效整数
        if (errno != 0) {
            printf("Line '%s' 无效:整数超出范围(溢出/下溢)\n", line);
        } else if (endptr == line) {
            printf("Line '%s' 无效:没有任何有效数字字符\n", line);
        } else if (*endptr != '\0') {
            printf("Line '%s' 无效:整数后还有多余字符:'%s'\n", line, endptr);
        } else {
            // 这里id是有效的整数,若你的ID是int类型,可安全转换(确保范围符合)
            int IDRead = (int)id;
            printf("有效整数:%d\n", IDRead);
            // 在这里添加你的业务逻辑代码
        }
    }

    fclose(fp);
    return 0;
}

关键逻辑说明:

  • fgets:严格读取一整行,确保我们处理的是用户预期的单行内容
  • strtol:不仅能解析整数,还通过endptr指针告诉我们解析停止的位置——如果endptr没到字符串末尾,说明行里有非数字的多余字符
  • errno:用来检测解析时是否发生整数溢出或下溢,避免出现未定义行为

方法2:改进你的fscanf实现(局限性较大)

如果你坚持想用fscanf,可以先读取整行到缓冲区,再用sscanf解析,但这个方法有缓冲区溢出的风险,不如方法1可靠。

代码示例:

#include <stdio.h>

int main() {
    FILE *fp = fopen("users.txt", "r");
    if (fp == NULL) {
        perror("Failed to open file");
        return 1;
    }

    char line[256];
    int IDRead;
    // 用%255[^\n]读取整行(最多255个字符,避免缓冲区溢出)
    while (fscanf(fp, "%255[^\n]", line) != EOF) {
        // 跳过换行符(因为%[^\n]不会读取换行符)
        fgetc(fp);

        // 先尝试解析整数
        if (sscanf(line, "%d", &IDRead) == 1) {
            // 再检查行里是否只有整数,没有多余字符
            char dummy;
            if (sscanf(line, "%d%c", &IDRead, &dummy) == 1) {
                printf("有效整数:%d\n", IDRead);
                // 业务逻辑代码
            } else {
                printf("Line '%s' 无效:包含多余字符\n", line);
            }
        } else {
            printf("Line '%s' 无效:不是整数\n", line);
        }
    }

    fclose(fp);
    return 0;
}

注意事项:

  • 这个方法依赖缓冲区大小,如果文件里的行超过256字符,会被截断,导致后续处理出错
  • %[^\n]不会读取换行符,所以必须用fgetc(fp)手动跳过,否则下次循环会一直读取同一个换行符

总的来说,方法1是最稳健的选择,既能保证逐行处理,又能准确验证每行是否为纯整数,还能处理各种异常情况。

内容的提问来源于stack exchange,提问作者j.nasser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:29