如何用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。
问题原因
你的代码有两个核心问题:
%[^\n]本身就是读取到换行符为止的格式说明符,后面加s完全多余,会导致fscanf匹配失败,后续所有读取操作都会出错。- 第一次读取完成后,文件指针停留在第一个换行符的位置,下一次
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
相关产品推荐
相关产品推荐

