3

我知道我不应该开始使用 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.
4

3 回答 3

3

对我来说效果很好,这不是您认为的 C++ 流文件 I/O 固有的问题。

也许尝试添加ios::in到 openmode 标志。根据标准的 27.8.1.6,它需要或与 ios::in 一起使用,所以这可能不会做任何事情。

尝试检查实际设置了哪个位 - 而不是调用 good(),尝试分别检查 bad()、eof() 和 fail()。这可能会提供有关错误是什么的线索。

于 2008-10-06T13:24:37.720 回答
3

该设备是无缓冲的,必须以 512 字节的倍数读取。ifstream 做它自己的缓冲并且奇怪地决定提前读取1023个字节,但由于“无效参数”而失败。有趣的是,这个 ifstream 是在 FILE* 之上实现的。但是,留给自己设备的 FILE* 使用更好、更圆的字节数进行预读。

感谢 dtrace 提供重要线索。我想我们永远不会知道那些认为他们知道答案但不想说的人是否正确。

于 2008-10-07T01:15:43.307 回答
0

多年来,我在 C++ I/O 中发现了类似的随机问题。对我来说,这似乎是一种倒退。

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

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

于 2008-10-06T12:39:01.383 回答