fread读文件总是多出那么部分内容解决方法

本文探讨了使用fread函数在文本模式与二进制模式下读取文件的区别,特别是在Windows环境下,文本模式会将CR+LF自动转换为LF,导致实际读取的字节数与预期不符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件1.txt中的内容如下:

  “123”

   “456”

用下面的方式统计文件的字节数:   

    fp = fopen("1.txt", "r");

    fseek(fp, 0, SEEK_END);
    file_len = ftell(fp);

则file_len统计了文件1.txt中的字节数为:8

用函数 readLen = fread(data, 1, num, fp);读取到的字节数为:7

 

为什么两者会不一样呢?

 

 函数声明:int fread( void *buffer, size_t size, size_t num, FILE *stream );

说明:函数fread()读取[num]个对象(每个对象大小为size(大小)指定的字节数),并把它们替换到由buffer(缓冲区)指定的数组。数据来自给出的输入流,函数的返回值是读取的内容数量。

如果此时,需要读一个1024字节的文本,那么可以设置size为1,num为1024。当然,可以是size为1024,num为1。

问题也就来了,这两种方式哪个好呢。。。我习惯的是前者,这样的话fread的返回值为读入的字节数。及时读入有问题,也比较容易发现。而如果是后者,那么当fread没有读入预想到的长度(比如size = 1024)那么fread的返回值会是0这就比较麻烦了。。。

这还有问题可能更有意思,一开始还真没怎么注意到,先看一段MSDN:

If the given stream is opened in text mode, carriage return–linefeed pairs are replaced with single linefeed characters. The replacement has no effect on the file pointer or the return value.

就是说如果按“文本模式”打开一个文件,那么在读入的时候,Windows默认的换行符CR+LF就会转换成一个单个的LF。

那么也就是说,如果一个文本文件的大小为1024字节,一共100行,那么fread最多只能读入924个字节。

在这种情况下,fread( buffer, 1, 1024, stream )的返回值将会是924个字节。
fread( buffer, 1024, 1, stream )的返回值,将会是0 。。。-_-!

 

 

这也就解释了开始为什么两者统计的结果会不一样。当我们把开始的改成下面形式:(即以二进制模式打开文件)

 

用下面的方式统计文件的字节数:   

    fp = fopen("1.txt", "rb");

    fseek(fp, 0, SEEK_END);
    file_len = ftell(fp);

则file_len统计了文件1.txt中的字节数为:8

用函数 readLen = fread(data, 1, num, fp);读取到的字节数为:8

 

这也两者的结果就一样了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云雨巫山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值