SCNU-HJT 2019-11-26 10:14 采纳率: 100%
浏览 720
已采纳

新人求助!!为什么输出的结果是乱码

#include<stdio.h>
#include<stdlib.h>
FILE *f1;
int main()
 {
    char ch;
    int i;
    f1=fopen("temp.bin","wb");

    if(f1==NULL)
    {
        printf("文件打开失败\n");
        exit(0);
    }

    for(i=0;i<128;i++)
    {
        fputc(i,f1);
    } 

    fclose(f1);

    f1=fopen("temp.bin","rb");
    if (f1==NULL)
    {
        printf("文件打开失败\n");
        exit(0);
    } 

    while(ch=fgetc(f1)!=EOF)
    {
    putchar(ch);    
    }
    ![图片说明](https://img-ask.csdn.net/upload/201911/26/1574734459_494095.jpg)

    fclose(f1);

  return 0;
 }

  • 写回答

1条回答 默认 最新

  • 辉歌 2019-11-26 12:30
    关注

    原因很简单:
    while( ch=fgetc(f1) !=EOF) //优先级问题。
    {
    putchar(ch);

    }

    /** 以下回答,是一个老司机翻车现场,可以看个笑话。在做这题的时候,我很奇怪为什么都是乱码,结果推翻了我自己的回答。**/
    看您的代码,是先创建文件,然后写入128个字符,写入方式为这样的:
    for(i=0;i<128;i++)
    {
    fputc(i,f1);
    }

    然后读出文件内容,打印到屏幕上去。

    为什么是乱码呢?不是您的文件读写有问题。而是您对ASCII还没有理解。您可以直接试试看下面的代码:
    for(i=0;i<128;i++)
    {
    putc(i);
    }

    您会发现用putc打印到屏幕的字符串也是乱码。
    原因就是putc(i)中的i,根据您循环的取值,是0---128,这个数值,对应于ASCII表的0-128对应的字符,这些值中0-31对应的字符都不是可打印的字符。但是32-126对应的字符是可打印的。

    我尝试了,后面部分是可以打印出来的。

    我觉得解决这个问题我的思考过程很重要。
    1,我首先是用循环方式调用putchar,发现打印并非全乱码。说明不是ASCII问题。
    2,难道是写入问题?
    我使用hexdump来查看写出来的文件temp.bin,发现是正确的。
    3,难道是读出来的问题?是碰到了什么特殊控制符让读出截断,后面的可打印字符没有打印出来?
    加了计数后,看到是全部读出来了。
    4,到底哪里读错了?
    我在while循环中,将读出来的每一个字符和对应的序号打印出来,发现所有读出来的字符,打印的内容全部是一样的乱码符号。
    5,将读出来的数值直接按照整数打印出来。
    发现整数值全部是1.
    6,此时还没有怀疑是优先级问题。
    7,思考良久,难道是优先级问题?
    尝试,发现真是。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器