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

为何代码无法显示文件全部字符?替换换行符后输出异常

代码无法显示文件所有字符,仅输出#的问题排查

问题描述

编写的代码无法显示文件中的所有字符,尝试使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:40:13