代码之家  ›  专栏  ›  技术社区  ›  Gordon Childs

为什么C++流不能从设备中读取?

  •  3
  • Gordon Childs  · 技术社区  · 16 年前

    我知道我不应该开始使用C++IO,整个“类型安全”的论点是一个红鲱鱼。 真的? 发现这是他们最紧迫的问题之一?)不管怎样,我发现了ifstreams和file*s以及简单的旧文件描述符之间的一个奇怪的区别:ifstreams不能从设备中读取。有人能想出原因吗?

    const char* path = "/dev/disk3";
    char        b;
    
    // this works
    FILE* f= fopen(path, "rb");
    int i = fread(&b, 1, 1, f);     // returns 1, success!
    
    // this does not work
    ifstream    cf(path, ios::binary);
    cf.read(&b, 1);
    bool        good = cf.good();   // returns false, failure.
    
    3 回复  |  直到 16 年前
        1
  •  3
  •   Greg Rogers    16 年前

    对我来说很好,它并不是像你所想的C++流文件I/O所固有的问题。

    可能尝试添加 ios::in 打开模式标志。根据本标准27.8.1.6的规定,iOS::In或与iOS::In一起使用可能不会有任何作用。

    尝试检查实际设置的位-而不是调用good(),尝试分别检查bad()、eof()和fail()。这可能会给我们提供错误的线索。

        2
  •  3
  •   Gordon Childs    16 年前

    设备没有缓冲,必须以512字节的倍数读取。如果流是自己缓冲的,奇怪的是决定读取 一千零二十三 前面的字节数,以“无效参数”失败。有趣的是,这个ifstream是在文件*的顶部实现的。然而,留给自己设备的文件*正在使用更好、更圆的字节数进行读取。

    感谢DTrace提供的重要线索。我想我们永远不会知道那些认为自己知道答案但不想说的人是不是对的。

        3
  •  0
  •   Lou Franco    16 年前

    多年来,我在C++ I/O中发现了这样的随机问题。在我看来,这总是一个倒退。

    我没有试过,但你可能想看看Boost能提供什么:

    http://www.boost.org/doc/libs/1_36_0/libs/iostreams/doc/index.html