为何代码无法显示文件全部字符?替换换行符后输出异常
代码无法显示文件所有字符,仅输出#的问题排查
问题描述
编写的代码无法显示文件中的所有字符,尝试使用getc()和fscanf()均未解决。仅在尝试将字符'\n'替换为其他字符并打印时出现该问题,当前看不到正常输出,仅能看到#字符。
控制台截图显示:仅输出一串连续的#,无其他文件内容。
原代码如下:
#include<stdio.h> #include<stdlib.h> int main() { char str[1]; FILE *file; file = fopen("dataloger.txt", "rb"); while(fread(&str[0], sizeof(str), 1, file) ==1){ if(str[0] =='\n'){ str[0] = '#'; } printf("%s", str); } fclose(file); /************************************************ int c; if (file) { while ((c = getc(file)) != EOF){ if(c =='\n') { c = '#'; } printf("%c", c); } fclose(file); }
问题根源
1. fread代码块的核心错误
char str[1];定义了长度为1的字符数组,但printf("%s", str);要求传入以'\0'结尾的字符串。仅传入单个字符时,printf会从str[0]开始持续读取内存直到碰到'\0',触发未定义行为,导致输出异常。- 用
"rb"二进制模式打开文本文件,会保留原始换行符(如Windows下的\r\n),但这不是导致仅输出#的直接原因。
2. 被注释的getc代码块的错误
第一个代码块已经调用fclose(file);关闭了文件,后续getc代码块中的file已是无效指针,逻辑不会执行。
修复方案
方案1:修复fread版本
改用单个字符存储,配合%c打印(无需字符串终止符):
#include<stdio.h> #include<stdlib.h> int main() { char ch; FILE *file = fopen("dataloger.txt", "r"); // 文本模式打开文本文件 if (!file) { // 必须判断文件是否打开成功 perror("打开文件失败"); return 1; } while(fread(&ch, sizeof(ch), 1, file) == 1){ if(ch == '\n'){ ch = '#'; } printf("%c", ch); // 用%c打印单个字符 } fclose(file); return 0; }
方案2:修复getc版本
调整代码顺序,确保getc逻辑在文件关闭前执行,同时添加文件打开失败判断:
#include<stdio.h> #include<stdlib.h> int main() { int c; FILE *file = fopen("dataloger.txt", "r"); if (file) { while ((c = getc(file)) != EOF){ if(c == '\n') { c = '#'; } printf("%c", c); } fclose(file); } else { perror("打开文件失败"); return 1; } return 0; }
关键注意事项
- 打印单个字符使用
%c格式符,打印字符串才用%s,且%s要求字符串必须以'\0'结尾,否则会触发未定义行为。 - 文件打开后必须判断是否成功,避免空指针操作导致程序崩溃。
- 处理文本文件时,优先使用
"r"文本模式,而非二进制模式"rb",系统会自动处理换行符转换。
内容的提问来源于stack exchange,提问作者MAGED AL-WARD
相关产品推荐
相关产品推荐

