读写大文件

liaomingxue none 服务器端工程师  2004-05-05 04:03:27
环境:DOS, BC or TC
问题:读取文件的时候,如果文件太大,那么程序就会不正常退出,没有什么提示信息,仅仅只有:program abnormally terminated. 经过反复测试,当文件大小>=34309bytes时候(占用空间恰好为40KB),程序就会不正常退出,否则就可以正常读取。

请问是什么原因?编译器模式?还是DOS缓冲区大小限制?怎么解决?
...全文
26 7 点赞 打赏 收藏 举报
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
gzlucky 2004-05-05
stamp[16]='\0';

字符越界了。
  • 打赏
  • 举报
回复
cngdzhang 2004-05-05
我找到你的程序的问题所在了:)

就是

charRead=fgetc(file);
if(charRead==EOF) break;

因为你的程序刚好读到那个地方的字符恰好是EOF,EOF的值是-1
所以程序没读完文件就退出了

解决办法:

charRead=fgetc(file);
if(charRead==EOF) break;
改为:
charRead=fgetc(file);
if(feof(file)) break;

另外
charRead最好声明为
char charRead;
文件打开方式为
"rb"


  • 打赏
  • 举报
回复
liaomingxue 2004-05-05
ok, you are right.
I use the count variable, which type is INT, to record how many bytes read. So when the file size is greater than MAX_INT, maybe the array will overflow(minus index).Now I changed its type to LONG. OK,it works now.

Thank you very much.
  • 打赏
  • 举报
回复
liaomingxue 2004-05-05
const char paddings[]="0123456789abcdef";
  • 打赏
  • 举报
回复
liaomingxue 2004-05-05
OK, 下面是源代码的一部分
/*
filePath: the absolute path of file which is to add stamp
stamp: the file's stamp which length is 16
*/
void getStamp(char* filePath,char* stamp)
{
FILE* file;
int count=0,charRead;

file=fopen(filePath,"rt");

for(;;)
{
charRead=fgetc(file);
if(charRead==EOF) break;
if(count<16) stamp[count]=charRead;
else stamp[count%16]^=charRead;
count++;
}
while(count<16) {stamp[count]=paddings[count];count++;}
while(count%16 != 0) {stamp[count%16]^=paddings[count%16];count++;}
stamp[16]='\0';
fclose(file);
}
  • 打赏
  • 举报
回复
backspray 2004-05-05
这个不可能....我就调用过1MB大的文件...没有出事过...
而且 从理论上这个也不成立..因为..每读一个字符..只是指针向后移..
再读入再后移...
而读入的字符没有入栈..就不可能溢出...
能把你的代码发一下..研究一下...吗?
  • 打赏
  • 举报
回复
cngdzhang 2004-05-05
是你的数组越界了吧?
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-05-05 04:03
社区公告
暂无公告