关于文件操作那些事儿

ZZM186 2012-05-10 11:17:32
#include<iostream>
using namespace std;
int main()
{
FILE *in=fopen("fi.dat","r");
try{
if(!in)
throw in;
}
catch(FILE*)
{
cerr<<"文件打开失败!"<<endl;
exit(1);
}

char a[100]={0};
fread(a,100,100,in);
fclose(in);
cout<<a<<endl;
return 0;
}
为什么有的时候能输出fi.dat中的内容,有的时候就输出为空.把char a[100]={0};改成:char *a =new char[100];memset(a,0,100);为什么问题就解决了呢?
...全文
87 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
羽飞 2012-05-11
  • 打赏
  • 举报
回复
感觉改和不改都是一样的,只是一块内存,一个在堆一个在栈,没什么问题
liangbch 2012-05-11
  • 打赏
  • 举报
回复
其确认文件是文本文件吗?有没有ASCII为0的字符?你确定文件包含的字符数一定大于100吗?
如果
是文本文件,文件中没有ASCII为0的字符。
那么
如果 文件内容小于100个字符,那个清buff是必须的,
如果 文件大于等于100个字符,那个你的这段代码完全不能工作。
注意:在C语言中,ASCII为0的字符意味这字符串结束标记,清buff的功能做用是,所有字节都改为0,当读入n个字节,第n+1个字节肯定为0,所有只显示n个字符。

这段代码仍然需要改进,正确的做法是先确定文件的长度,然后分别一块比文件长度稍长的缓冲区,先清整个缓冲区,然后再读入字符。
下面给出示例代码。

fseek(fp1,0,SEEK_END);
byteCount=ftell(fp1);
inBuff=(char *)malloc(byteCount+1);
memset(inBuff,0,byteCount+1);
fseek(fp1,0,SEEK_SET);
fread(inBuff,byteCount,1,fp1);
fclose(fp1); fp1=NULL;

whayxh 2012-05-11
  • 打赏
  • 举报
回复
参数的第一个100错了吧,应该是sizeof(char)吧,其他应该就是2,3l说的了
W170532934 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

其确认文件是文本文件吗?有没有ASCII为0的字符?你确定文件包含的字符数一定大于100吗?
如果
是文本文件,文件中没有ASCII为0的字符。
那么
如果 文件内容小于100个字符,那个清buff是必须的,
如果 文件大于等于100个字符,那个你的这段代码完全不能工作。
注意:在C语言中,ASCII为0的字符意味这字符串结束标记,清buff的功能做用是,所有……
[/Quote]
++
楼主的修改基本上没有什么区别。
ZZM186 2012-05-11
  • 打赏
  • 举报
回复
f1.dat中的内容不存在各位说的那样,也没有超过100个字符,fi.dat 内容如下:
#include<iostream>
using namespace std;

单步调试char a[100]={0};
fread(a,100,100,in);这两句,有时候发现a中还是全部都是0,所以输出为空.

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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