【问题标题】:fstream unix problem in readingfstream unix 阅读中的问题
【发布时间】:2011-02-02 12:36:22
【问题描述】:

我正在尝试从 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();
}

读取后我得到文件中的位置仍然为零零,但文件不是空的。

【问题讨论】:

  • s/fstrean/fstream/。除此之外,你应该检查fstream::open是否真的成功,例如:assert(fstrHandler.good())
  • 我没有添加,但是存在
  • 并遵循下面的 cmets,assert(fstrHandler) 而不是 good()。

标签: c++ unix fstream


【解决方案1】:

试试seekg而不是seekp,文件中有400字节吗?如果您输入的文件包含超过 400 个字节,这对我来说似乎没问题。如果小于,则读取后的tellg 报告-1,但gcount() 是正确的。

此外,打开文件后 - 测试文件是否确实打开过,例如

if (fstrHandler)
{
// do stuff
}
else
  std::cerr << "foo bar" << std::endl;

【讨论】:

  • 该条件将始终评估为真。不过有一个operator!,或good(),或fail(),或is_open()
  • @jweyrich: if (stream) 并不总是正确的after opening,它与 op! 相反,它本身与 fail() 相同。不要使用 good()。
  • @Fred Nurk:有一个operator bool()?我一直认为operator! 需要明确使用它。看来我从那以后就错了。为什么不使用 good()?它检查 bad/eof/fail,在这种情况下似乎也没问题。
  • @Fred Nurk:哦,没关系,我找到了第一个问题的答案here。不错的收获:-)
  • @jweyrich:Good() 测试所有三个,但 eof() 为真并不意味着 fail()(实际上检查 failbit 和 badbit)为真。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多