c fopen fread 错误

真的被,读取一个txt文本,结果一个早上都没搞好

程序如下:

能看出哪里有问题么,输出字符串,得到的结果后面有“屯”或则 “烫”,单个字符输出来也有,为何,搜啊搜,改txt的内容,依旧不行

最后 改fopen 的r 改为rb就可以了,神奇了,明明txt就是ascii码文件啊,为什么要改成rb啊,b是二进制的意思啊

再搜,论坛里面高人说了:

二进制打开之后可以使用fgets,ascii打开之后也可以使用fwrite。
区别就是
“只不过回车符有点不一样。一个是0x0a,一个是0x0d 0x0a。具体哪个是哪个我也记不得了。”

二进制方式打开
1、会把所有字符都读出来,包括:回车,换行,'',直到文件结束,才停止读;
2、可以完全读出所有类型的文件,包括:exe,dll,ocx......
ascii方式打开,当遇到以下字符:
1、回车,换行,'',则当前一行文本的停止读的地方,直到本行结束,都不能读出,接着读下一行;
2、只能正确读出文本文件。

要求两个对应:
1  是操作函数与打开方式对应,如 使用fread/fwrite 则要使用2进制方式操作文件,
   如果使用的是 文本方式(ascii)可能会出错 ...
2  文件的读 和写方式对应,一个文件写的时候是 2进制方式的,那么读取的时候也用2进制方式,否则可能获取的数据会有差别,差别的来源就在于 两种操作方式的差别:一个直接作为2进制流(2进制方式)操作, 一个是以字符流方式操作(ascii) ...

这哪里是二进制打开和文本打开的区别,明明是dos和unix回车符号的区别。

我来总结下:其实fopen打开文件 什么  “rb”  “rt”  “r” 这些其实不分文本文件和二进制文件的,但是你使用二进制打开文件,你就不要用fputs  fgets 这样ascii的操作函数,你得用fread  fwrite

同样的,你用ascii码方式打开文件,那么你就不要用fread,我就是犯了这样的错误

mark::

原文地址:https://www.cnblogs.com/dragon2012/p/3978751.html