我知道我永远不应该开始使用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.
答案 0 :(得分:3)
对我来说很好,这不是你想象的c ++流文件I / O固有的问题。
也许尝试将ios::in
添加到openmode标志中。根据标准的27.8.1.6,它需要或与ios :: in一起使用,所以这可能不会做任何事情。
尝试检查实际设置的位 - 而不是调用good(),尝试单独检查bad(),eof()和fail()。这可能会给出错误是什么的线索。
答案 1 :(得分:3)
设备是无缓冲的,必须以512字节倍数读取。 ifstream确实是自己的缓冲,奇怪地决定提前读取 1023 字节,但是“无效参数”失败了。有趣的是,这个ifstream是在FILE *之上实现的。然而,FILE *留给它自己的设备正在使用更好,更圆的字节数读取。
感谢dtrace的重要线索。我想我们永远都不会知道那些认为他们知道答案却又不想说的人是对的。
答案 2 :(得分:0)
我已经在C ++ I / O中找到了这样的随机问题多年。对我来说,它似乎总是向后迈出一步。
我还没试过,但你可能想看看Boost提供的东西:
http://www.boost.org/doc/libs/1_36_0/libs/iostreams/doc/index.html