c语言文件读写有buffer什么的吗?跪求高手解答

gyx2cn 2011-10-12 06:31:12
我做了一个Generate函数,生成Record型的记录1000个,因为做的是有关硬盘读写的实验,所以每40个Record,做一次fwrite。这样,一个Record是100byte,40个正好是4000byte,和windows系统一个硬盘的block差不多。经过检查,我的写文件函数Generate没有问题,写到文件中的数据都是对着的。

下面是问题,我写了ReadFile函数,我想给这些记录一个缓存,比如我这给了一个是1000个记录的空间,就是一个Record数组。然后fread(pRcd,100,25*40,fp); 我想这个Record数组里应该就是我要的数据了。但是,我发现在第59个记录之后,我屏幕上输出的值就有问题了,我把控制台输出的结果前边的数字贴过来:

File is open!
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
5705 28145 23281 16827 9961 491 2995 11942 4827 5436
32391 14604 3902 153 292 12382 17421 18716 19718 19895
5447 21726 14771 11538 1869 19912 25667 26299 17035 9894

28703 23811 31322 30333 17673 4664 15141 7711 28253 6868
25547 27644 32662 32757 20037 12859 8723 9741 27529 199181(从这个开始就出错了,后面的明显偏大)
3153101 777165 5680845 471757 73933 7707341 2314445 2289357 4931789 5798093
7026381 6094285 4068045 1722829 6238925 3929805 3841741 7962061 6244813 908493

5025229 3231693 6165709 5108429 4801741 3031245 1271501 1888461 3566541 6735053

4337869 8304589 6304461 2898893 1417677 5513933 4126413 533197 5870029 4234701
1237453 7965645 1187789 7592653 5812429 2542285 3578317 590541 8108493 5731021


下面是我的代码,求高手解答,是不是fread中有大小的要求?还是什么原因。。。

#include "stdafx.h"
#include "malloc.h"
#include "stdlib.h"

typedef struct
{
int keyValue;
char data[96];
}Record;

bool Generate()
{
FILE* fp;
fp = fopen("test.txt","w");

int count = 0;
do
{
int i;
Record* prcd = (Record*)malloc(sizeof(Record) * 40);

for(i = 0; i < 40; i++)
{
prcd[i].keyValue = rand();
printf("%5d ",prcd[i].keyValue);
if((i+1)%10==0) printf("\n");
}

fwrite(prcd,sizeof(Record)*40,1,fp);
printf("\nWrite block %d into file... \n",count);
free(prcd);

}while((1000- 40 * count++)>0);
fclose(fp);
return true;
}


bool ReadFile()
{
FILE* fp;
fp = fopen("test.txt","rb");
if(NULL == fp)
{
printf("Fail to open file\n");
return false;
}
else
{
printf("File is open!\n");
}
//char *mem = (char*)malloc(25*40*100);

Record pRcd[1000];

fread(pRcd,100,25*40,fp);

for(int i = 0;i < 1000; i++)
{
printf("%d ",pRcd[i].keyValue);
if((i+1)%40==0)
printf("\n");
if((i+1)%10==0)
printf("\n");
}
fclose(fp);
return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
//Generate();
ReadFile();


return 0;
}
...全文
424 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gyx2cn 2011-10-12
  • 打赏
  • 举报
回复
ls两位,我然后看了,都是对着的,读了多少写了多少都是没有错的。
这个的问题可能和block大小有关,可能涉及到间断存储什么的
only_lonely 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]

楼主从来没有判断过fread返回了多少,fwrite写入了多少。
[/Quote]
是的。,
qq120848369 2011-10-12
  • 打赏
  • 举报
回复
楼主从来没有判断过fread返回了多少,fwrite写入了多少。
ProgrammingRing 2011-10-12
  • 打赏
  • 举报
回复
make..看高手回答
gyx2cn 2011-10-12
  • 打赏
  • 举报
回复
求解答啊,代码贴出来是求大家帮我看问题啊。我就是想问fread一次能读多少数据进来,有大小的要求吗,假如我要读50MB,那会有问题吗?
qq1871343189 2011-10-12
  • 打赏
  • 举报
回复
哥们一大堆代码会看得头昏的

69,373

社区成员

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

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