关于fread读不出最后一个字节1A的问题(已经使用了rb模式)

xingxing 2006-04-20 02:50:49
有一数据文件,用fread读数据,结果最后一个字节读不出来。最后一个字节是1A,但是已经设置了文件打开模式为rb方式(fopen指定了rb模式)。
环境是windows + vc6.
...全文
644 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
RainWindy 2006-04-21
  • 打赏
  • 举报
回复
你一个一个字节读取的,试一下看还有没有问题:fread(buffer, 1, 1, fp);


觉得是你使用fread(buffer, 100, 1, fp)读取数据,但剩下还不到100个可读取的数据引起的。
试试fread(buffer, 1, 100, fp),看看返回值是多少,上面已经有位仁兄说过了。
binglex 2006-04-21
  • 打赏
  • 举报
回复
估计楼主是在别的地方有问题,用你的代码写个测试程序,不可能有问题。

测试程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
FILE *fd;
char pBuffer1[200],pBuffer[200];
int n;
if ((fd = fopen("b.txt", "rb")) != NULL)
{
memset(pBuffer1, 0, sizeof(pBuffer1));
n = fread(pBuffer1, 10, 1, fd); // 先读10个字节
printf("%d:%d:%s\n", n,strlen(pBuffer1),pBuffer1);

memset(pBuffer, 0, sizeof(pBuffer));
n = fread(pBuffer, 10, 1, fd);
printf("%d:%d:%s\n", n,strlen(pBuffer),pBuffer);

fclose(fd);
}
}

测试数据:共11字节,最后一个字节是0x1a
0123456789

测试结果:
1:10:0123456789
0:1:
binglex 2006-04-21
  • 打赏
  • 举报
回复
因为你用的是n = fread(pBuffer, 100, 1, fd);所以如果读到的不够100字节时,n就是0,否则就是1.

如果你使用n = fread(pBuffer, 1, 100, fd);n就是读到的字节数了。
笑面佛_正版 2006-04-20
  • 打赏
  • 举报
回复
int nRead;
nRead = fread(pBuffer, 1, 100, fd);
nRead 就是你读出的字节数
ChenSu2008 2006-04-20
  • 打赏
  • 举报
回复
刚贴上去的时候那个1a的字符是有的来,
是个向右的小箭头,再打开的时候就没有了,晕
duduhaha 2006-04-20
  • 打赏
  • 举报
回复
楼上的,那是我写的. :)

楼主为啥不把程序和测试文件贴出来呢?
ChenSu2008 2006-04-20
  • 打赏
  • 举报
回复
汗,原来是duduhaha写的

这个程序也可以读出来
那个文件中的内容为:abdefg
我用UltraEdit处理的

#include <string.h>
#include <stdio.h>

int main(void)
{
FILE *stream;
char buf[20]={0};

if ((stream = fopen("D:\\DUMMY.FIL", "rb"))
== NULL)
{
fprintf(stderr,
"Cannot open output file.\n");
return 1;
}
/* read the data and display it */
fread(buf, 100, 1, stream);
printf("%s\n", buf);

fclose(stream);
return 0;
}
ChenSu2008 2006-04-20
  • 打赏
  • 举报
回复
我可以读到呀,用你的程序。

结果为:1a feof=0 1
duduhaha 2006-04-20
  • 打赏
  • 举报
回复
下面这个程序没问题.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
unsigned char c;
FILE *fp;
fp = fopen("1.txt","w");
if(fp == NULL)
exit(-1);
fprintf(fp, "\x1a");
fclose(fp);

fp=fopen("1.txt", "rb");
if(fp == NULL)
exit(-1);


i = fread(&c, sizeof(char), 1, fp);
printf("%x feof=%d %d\n", c, feof(fp),i);

fclose(fp);
return 0;
}
xingxing 2006-04-20
  • 打赏
  • 举报
回复
哎,确认len不错。查看0x1a的方法那样看应该没的错。

在郁闷中继续......
ChenSu2008 2006-04-20
  • 打赏
  • 举报
回复
我说的长度的意思就是多少块的意思。
呵呵,看来我的表述有问题,不好意思。
boxban 2006-04-20
  • 打赏
  • 举报
回复
不用怀疑fread()和Windows/VC6
肯定是你的代码有问题或者是你错误地报告了一个BUG

从2方面找原因:
1。确认len
2。确认文件内容以及你查看0x1A的方法
xingxing 2006-04-20
  • 打赏
  • 举报
回复
单步跟踪,发现pBuffer的内容为空。而读出来的情况应该是*pBuffer = 1a的。
fread返回0(如果文件只有一个字节1A没读出来的时候)。

个人觉得因为加了rb模式,而读不出来数据1A,是不是和编译器或者环境有关系?

如果用其他方式读文件,而不用fread,是可以读出来那个数据的。只是用fread读不出来。

完整程序和测试文件贴出来一样的,大家可以构造一个只有1A的文件,然后用上面的代码读,一样的效果。
duduhaha 2006-04-20
  • 打赏
  • 举报
回复
我先问个问题,你是如何判断没有读出0x1a的?

利用fread的返回值和feof肯定能解决问题的.把完整程序和测试文件贴出来啊.
xingxing 2006-04-20
  • 打赏
  • 举报
回复
谢谢大家的好意了,len的问题早就怀疑了。没的问题,很大的。整个代码就是这点和文件有关系
我的代码是
if ((fd = fopen(fileName, "rb")) != NULL)
{
fread(pBuffer1, 100, 1, fd); // 先读100个字节
fread(pBuffer, 100, 1, fd); // pBuffer里没有最后一个字节数据,100肯定大于等于文件剩下的最大长度的

fclose(fd);
}

ChenSu2008(北海沉书) ( ) num表示的是块的意思。不是大小,大小是size才是。
ChenSu2008 2006-04-20
  • 打赏
  • 举报
回复
呵呵,你可以在代码读了的下面加个 feof(fd);
看看有没有结束的。

ChenSu2008 2006-04-20
  • 打赏
  • 举报
回复
#include <stdio.h>
int fread( void *buffer, size_t size, size_t num, FILE *stream );

The function fread() reads num number of objects (where each object is size bytes) and places them into the array pointed to by buffer. The data comes from the given input stream. The return value of the function is the number of things read.

那个num才是长度呀。lz的是1
duduhaha 2006-04-20
  • 打赏
  • 举报
回复
你把完整程序和测试文件都贴出来看看.二进制应该对于0x1a没问题.
toryhector 2006-04-20
  • 打赏
  • 举报
回复
建议你debug跟下len的情况
toryhector 2006-04-20
  • 打赏
  • 举报
回复
估计是你求LEN时候忘记+1了。
加载更多回复(3)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧