Почему c ++ не может читать потоки с устройств? - PullRequest
3 голосов
/ 06 октября 2008

Я знал, что никогда не должен был начать использовать c ++ io, весь аргумент "безопасности типов" - это красная сельдь (кто-нибудь действительно обнаружит, что это одна из их самых насущных проблем?). Так или иначе, я обнаружил странную разницу между ifstreams и FILE * и простыми старыми файловыми дескрипторами: 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 ]

3 голосов
/ 06 октября 2008

Работает нормально для меня, это не проблема, присущая вводу / выводу потокового файла c ++, как вы, кажется, думаете.

Возможно, попробуйте добавить ios::in к флагам openmode. В соответствии с 27.8.1.6 стандарта требуется или с ios :: in, так что это, вероятно, ничего не даст.

Попробуйте проверить, какой бит установлен на самом деле - вместо вызова good () попробуйте проверить bad (), eof () и fail () по отдельности. Это может дать ключ к пониманию ошибки.

3 голосов
/ 07 октября 2008

Устройство не буферизовано и должно считываться из 512-кратных кратных. ifstream выполняет свою собственную буферизацию и странным образом решил прочитать впереди 1023 байт, что завершается неудачно с «неверным аргументом». Интересно, что этот ifstream реализован поверх FILE *. Тем не менее, FILE *, предоставленный его собственным устройствам, читал вперед, используя более округлое число байтов.

Благодаря dtrace для жизненно важных подсказок. Я думаю, мы никогда не узнаем, были ли люди, которые думали, что знали ответ, но не хотели сказать, были правы.

0 голосов
/ 06 октября 2008

Я обнаружил случайные проблемы, подобные этой, в C ++ I / O в течение многих лет. Это всегда казалось мне шагом назад.

Я не пробовал, но вы можете посмотреть, что может предложить Boost:

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

...