Unix中使用fstream读取文件时出现问题

3

我将尝试从UNIX上的二进制文件中读取数据。该文件已经存在并且其中包含了多个数据信息。

代码如下:

fstrean fstrHandler;

string strFileName;

char Buf[30000];

fstrHandler.open(strFileName.c_str(), ios::in | ios::binary);

fstrHandler.seekp(0, std::ios_base::beg);

std::cout<< "Posi before read= "<< fstrHandler.tellg()<<endl; //*** Show after running 0

fstrHandler.read (Buf, 400);

std::cout<< "Posi after read= "<< fstrHandler.tellg()<<endl; //*** Show after running 0

std::cout<< " gcount ()= "<< fstrHandler.gcount ()<< << endl; //*** Show after running 0

if (fstrHandler.eof ()) {
       fstrHandler.clear();
}

阅读后,我得出结论:文件中的位置仍然是0 0,但文件不为空。


s/fstrean/fstream/。除此之外,您应该检查 fstream::open 是否真的成功了,例如:assert(fstrHandler.good()) - jweyrich
我没有添加它但它存在。 - Boris Raznikov
根据下面的注释,使用assert(fstrHandler)代替good()。 - Fred Nurk
1个回答

2
尝试使用seekg而不是seekp,并且文件中是否有400个字节?如果输入的文件包含超过400个字节,则这似乎可以正常工作。如果少于400个字节,则读取后的tellg报告为-1,但gcount()是正确的。
此外,在打开文件后,请测试以查看文件是否确实已打开。
if (fstrHandler)
{
// do stuff
}
else
  std::cerr << "foo bar" << std::endl;

那个条件将永远评估为真。不过,有一个operator!可以解决这个问题,或者使用good()fail()is_open() - jweyrich
1
@if (stream)在打开后并不总是为真(http://codepad.org/ARjqICEB),它与op!相反,而op!本身与fail()相同。不要使用good()。 - Fred Nurk
@Fred Nurk:有一个 operator bool() ?我一直以为需要显式使用 operator!。似乎我一直都错了,为什么不使用 good() 呢?它检查 bad/eof/fail,在这种情况下也可以。 - jweyrich
@Fred Nurk:当然可以。但在这种情况下使用它是可以的,除非OP想要区分原因,但由于他没有任何条件,这似乎不是问题。 - jweyrich
有时候它是等效的。问题在于“有时候”。如果你从不使用good(),你就不会遇到记住何时它是等效的和何时不是的问题。很少有人想知道eofbit可能被设置但fail()为false;因此,应该非常、非常少地使用good()。 - Fred Nurk
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接