3

私は、C++ io を使い始めてはならないことを知っていました。「型の安全性」の議論全体が赤ニシンです (これが最も差し迫った問題の 1 つであることに気付いた人はいますか?) とにかく、私はそうしましたが、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、オープンモードフラグに追加してみてください。標準の27.8.1.6によると、ios :: inに、または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 に答える