[求助]C++关于fstream的eof

colebin 2005-07-14 11:43:13
我的代码如下:
int _tmain(int argc, _TCHAR* argv[])
{
fstream file;

file.open( "basic_istream_tellg.dat", ios::out|ios::binary);
if (!file.is_open()) {
printf("error\n");
exit(-1);
}

char* buf = "Students";
int len = strlen(buf)+1;
file.write((char*)&len,sizeof(int));
file.write(buf, len);

file.close();

file.open( "basic_istream_tellg.dat", ios::in|ios::binary);
if (!file.is_open()) {
printf("error\n");
exit(-1);
}

file.seekg(streampos(0));
file.unsetf(ios::skipws);
bool end=false;
while(!end) {
if(file.eof())
{
end=true;
break;
}
char* buffer;
file.read((char*)&len,sizeof(int));
buffer = new char[len];
file.read(buffer, len);

printf(buffer);
}

file.close();

return 0;
}

但输出为:Students屯屯屯屯妄铪

为什么?
...全文
278 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
colebin 2005-07-15
  • 打赏
  • 举报
回复
谢谢楼上几位!
to naokii(西莫)和 newbiestar:读文件中有什么地方不妥,怎么设计读文件比较有效?
naokii 2005-07-15
  • 打赏
  • 举报
回复
不小心就会这样了。是你写文件时的错误,没有文件的结束符‘\0’。这样写了:
file.open( "basic_istream_tellg.dat", ios::out|ios::binary);
if (!file.is_open()) {
printf("error\n");
exit(-1);
}

char* buf = "Students";
int len = strlen(buf)+1;
file.write((char*)&len,sizeof(int));
file.write(buf, len);
file.write("\0",1);

file.close();

读文件时,也有不妥的地方。那个while循环设计的不够专业,尽管不会影响结果。
newbiestar 2005-07-15
  • 打赏
  • 举报
回复
你应该在每一个read以后检查eof的情况,这样的话就可以避免你现在的情况了
newbiestar 2005-07-15
  • 打赏
  • 举报
回复
读文件的时候有错误,还有就是printf用的极其不规范……

第一个参数是给你写格式用的,而不是让你作为字符串使用的……

具体原因如下:
你读文件的时候仅仅读到最后一个字节,文件状态并为被置为eof,只有当你的读入操作由于eof失败的时候,才会把文件状态置eof,所以你的循环执行了两次,这样的话虽然第一次读写成功了,但是第二次的读失败冲毁了你先前的内容(因为内存泄漏,new了确没有delete,估计你认为while循环只能执行一次……),所以打印的内容就不对了……

另外,printf按照这个用法的话,你如果文件里面存在"%s%p"这样的printf格式的话,得出的结果将是极其古怪的……
newbiestar 2005-07-15
  • 打赏
  • 举报
回复
peek带了读取操作测试的……
colebin 2005-07-15
  • 打赏
  • 举报
回复
可我如果用while(file.peek() != EOF) {

char* buffer;
file.read((char*)&len,sizeof(int));
buffer = new char[len];
file.read(buffer, len);

printf(buffer,len);
}
读出来是正确的
newbiestar 2005-07-15
  • 打赏
  • 举报
回复
根本问题在read上面,你需要在read后面判断是不是eof了,而不是在前面……

写文件么,只不过是不合规范而已,那个'\0'的确写进去了,一般每人这么干的……

在你这个例子里面都是写8进去,然后写Students进去就结束了,而不是9和"Students\0"

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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