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

如何用fscanf读取文件中换行结尾的字符串并解决读取异常

用fscanf和printf读取并逐行输出文件内容的问题解决

问题描述

我的文件内容如下(每行一个名字):

JOS BUTTLER
JASON ROY
DAWID MALAN
JONNY BAISTROW
BEN STOKES

我希望用fscanf()和printf()读取内容并完全按原格式输出,但尝试的代码只能读取第一个字符串,其余内容无法显示还出现垃圾值。代码如下:

char n[5][30];
printf("Name of 5 cricketers read from the file:\n");
for(i=0;i<5;i++)
{ 
        fscanf(fp,"%[^\n]s",&n[i]);
        printf("%s ",n[i]);         
}
fclose(fp);

请问该如何实现?同时想知道怎么把fscanf()的分隔符改成\n。

问题原因

你的代码有两个核心问题:

  1. %[^\n]本身就是读取到换行符为止的格式说明符,后面加s完全多余,会导致fscanf匹配失败,后续所有读取操作都会出错。
  2. 第一次读取完成后,文件指针停留在第一个换行符的位置,下一次fscanf遇到换行符时,%[^\n]会直接匹配失败,不会自动跳过换行符,导致后续读取的都是未初始化的垃圾值。

修正后的代码实现

方案一:用空格跳过空白字符(推荐)

在格式串开头加一个空格,它会自动跳过所有空白字符(包括换行、空格、制表符),同时去掉多余的s:

#include <stdio.h>

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

    char n[5][30];
    printf("Name of 5 cricketers read from the file:\n");
    for (int i = 0; i < 5; i++) {
        // 开头的空格跳过空白字符,%[^\n]读取到换行前的所有字符
        fscanf(fp, " %[^\n]", n[i]);
        // 输出时加换行,还原原文件格式
        printf("%s\n", n[i]);
    }

    fclose(fp);
    return 0;
}

方案二:手动跳过换行符

如果不想依赖空格跳过空白,也可以在每次读取后用%*c读取并丢弃换行符:

#include <stdio.h>

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

    char n[5][30];
    printf("Name of 5 cricketers read from the file:\n");
    for (int i = 0; i < 5; i++) {
        fscanf(fp, "%[^\n]", n[i]);
        printf("%s\n", n[i]);
        // %*c 读取一个字符但不存储,用来跳过换行符
        fscanf(fp, "%*c");
    }

    fclose(fp);
    return 0;
}

关于fscanf分隔符改为\n的说明

fscanf默认以所有空白字符作为分隔符,如果你想把\n作为唯一的结束/分隔标志,使用%[^\n]格式就可以实现——它会读取所有非换行的字符,直到遇到换行符停止,相当于把换行符作为读取的终止符。

注意:如果文件中存在空行,%[^\n]会匹配失败,这种情况需要额外处理。

内容的提问来源于stack exchange,提问作者John Doe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:24:23