2008-10-06 5 views
3

나는 C++ io를 사용해서는 안된다는 것을 알았습니다. 전체 "타입 안전"인자는 빨간 청어입니다 (은 실제로인데 가장 시급한 문제점 중 하나입니까?). 어쨌든, 필자는 ifstreams와 FILE * 및 일반 오래된 파일 설명 자간에 이상한 차이점을 발견했습니다. ifstreams는 장치에서 읽을 수 없습니다. 누구든지 이유를 생각할 수 있습니까?왜 장치에서 C++ ifstream을 읽을 수 없습니까?

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

FWIW, 주제를 벗어난 "큰 뚱뚱한 거짓말"의견은 지식이 풍부한 사람들이이 질문에 답하는 것을 방해 할 수 있다고 생각합니다. –

+0

OS 및 컴파일러 버전이 도움이 될 수 있습니다 ... – crashmstr

+0

나는 Kristopher Johnson에 동의합니다. 나는 그 답을 모른다. 그러나 나는 그것을 찾도록 강요 당하지는 않을 것이라는 것을 안다. – paercebal

답변

3

장치가 버퍼링되지 않았으므로 512 바이트 배수로 읽어야합니다. ifstream 자체의 버퍼링을 수행하고 이상하게 "잘못된 인수"로 실패하여 바이트를 읽는 것으로 결정했습니다. 흥미롭게도이 ifstream은 FILE * 위에 구현됩니다. 그러나 자체 장치에 남아있는 FILE *은 더 멋진 바이트 수를 사용하여 미리 읽었습니다.

중요한 단서를 제공하는 dtrace에게 감사드립니다. 나는 그들이 대답을 알고 있다고 생각하지만 말하기를 원하지 않는 사람들이 옳은지 결코 알 수 없을 것입니다.

+2

즉,'FILE *'버전은 버퍼 크기의 기본 선택 때문에 우연히 작동했습니다. C++ 스트림의 버퍼 크기를 제어 할 수 있다면 아마도 잘 작동 할 것입니다. 'basic_filebuf :: setbuf' 함수는 관련성이있는 것처럼 보입니다. –

+0

정확히 맞아, FILE *은 단순한 행운을 통해서만 작동 했으므로 파일 설명자 인터페이스로 넘어갔습니다. 하지만 모든 iostream 코드를 추출하기 전에. 나는 그것을 놓치지 않는다. 그것은 SO-09에 대해 너무 염증하지 않기를 바랍니다! 댓글 주셔서 감사합니다. –

0

나는 C++ 입출력에서 이와 같이 임의의 문제를 수년간 발견했습니다. 그것은 항상 나에게 거꾸로 한 걸음처럼 보였다.

나는 그것을 시도하지 않은,하지만 당신이 제공하는 어떤 부스트를보고 할 수 있습니다 :

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

3

작품 벌금을 나를 위해, 스트림 파일 C++에의하지에 문제가 고유의 I/O 당신이 생각하는 것처럼.

ios::in을 openmode 플래그에 추가해보십시오. 표준의 27.8.1.6에 따르면, ios :: in과 함께 또는 ios :: in이 필요하므로이 작업은 아무 것도하지 않을 것입니다.

실제로 어떤 비트가 설정되어 있는지 확인해보십시오. good()을 호출하는 대신 bad(), eof() 및 fail()을 개별적으로 확인해보십시오. 이것은 오류가 무엇인지에 대한 단서를 제공 할 수 있습니다.

+0

mine = non portable이 아닌 구현에서 작동합니다. 필자는 FILE *로 "다운 그레이드"하고 모든 것이 잘 작동합니다. Adios C++ 스트림, 당신을 잘 알고 있다고 말할 수 없습니다. –

+0

나는 ios :: in에서 시도했거나 시도했지만 운이 없었습니다. –

+0

그 후 플래그는 good = 0 eof = 0 fail = 1 AND ... "잘못된 인수"입니다. 이유가 궁금합니다. –