【问题标题】:c++ file bad bitc++文件坏位
【发布时间】:2010-03-30 17:48:50
【问题描述】:

当我运行这段代码时,open 和 seekg 和 tellg 操作都成功了。 但是当我阅读它时,它失败了,eof,bad,fail 位是 0 1 1。

什么会导致文件损坏? 谢谢


int readriblock(int blockid, char* buffer)
{
   ifstream rifile("./ri/reverseindex.bin", ios::in|ios::binary);

   rifile.seekg(blockid * RI_BLOCK_SIZE, ios::beg);
   if(!rifile.good()){ cout<<"block not exsit"<<endl; return -1;}
   cout<<rifile.tellg()<<endl;

   rifile.read(buffer, RI_BLOCK_SIZE);

   **cout<<rifile.eof()<<rifile.bad()<<rifile.fail()<<endl;**

   if(!rifile.good()){ cout<<"error reading block "<<blockid<<endl; return -1;}

   rifile.close();
   return 0;
}

【问题讨论】:

  • 如果您可以正确格式化您的代码(就像 Evan Teran 为您所做的那样)并使用 cmets 而不是“**”来突出显示特定代码(这样您的代码仍然可以编译),这将非常有帮助。

标签: c++ ifstream


【解决方案1】:

引用Apache C++ Standard Library User's Guide

标志 std::ios_base::badbit 表示底层流缓冲区存在问题。这些问题可能是:
  • 内存不足。没有可用于创建缓冲区的内存,或者由于其他原因(例如从流外部提供),缓冲区的大小为 0,或者流无法为其自己的内部数据分配内存,如 std::ios_base:: iword() 和 std::ios_base::pword()。
  • 底层流缓冲区引发异常。流缓冲区可能会失去其完整性,例如内存不足、代码转换失败或来自外部设备的不可恢复的读取错误。流缓冲区可以通过引发异常来指示完整性丢失,该异常被流捕获并导致在流的状态中设置坏位。

这并不能告诉你问题出在哪里,但它可能会给你一个起点。

请记住,EOF 位通常在尝试读取并失败之前不会设置。 (换句话说,在调用seekg 之后检查rifile.good 可能不会完成任何事情。)

正如 Andrey 建议的那样,检查 errno(或使用特定于操作系统的 API)可能会让您解决根本问题。 This answer 有执行此操作的示例代码。

旁注:因为rifile 是一个本地对象,所以完成后不需要关闭它。理解这一点对于理解RAII(C++ 中的一项关键技术)很重要。

【讨论】:

  • 谢谢大家,使用这个功能后发现我的缓冲区不可写
【解决方案2】:

试试旧的errno。它应该显示错误的真正原因。不幸的是,没有 C++ish 方法可以做到这一点。

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 2021-04-17
    相关资源
    最近更新 更多