- ベストアンサー
EOFにならない?
元ネタ http://oshiete1.goo.ne.jp/qa3809521.html /* C# */ using System; namespace Q3809521A { class Q3809521A { public static void Main(string[] args) { byte[] b1 = {0x42,0xb9,0xe0,0xa4,0x3b,0xdf,0xea,0xc0,0x3a,0x70,0xeb,0xdc,0x37,0x7c,0xf4,0x8c}; System.IO.FileStream f = new System.IO.FileStream("C:\\hogefuga.bin",System.IO.FileMode.Create, System.IO.FileAccess.Write); f.Write(b1,0,b1.Length); System.Console.WriteLine(BitConverter.ToString(b1)); f.Close(); System.Console.ReadKey(true); } } } という風に作ったhogefuga.binを bccでコンパイルした以下のプログラムで読み込ませたところ, #include <iostream> #include <fstream> int main () { unsigned char buf[4]; float *hoge; std::ifstream ifs ( "hogefuga.bin" , std::ifstream::in ); while(!ifs.eof()){ // Debug // std::cout << (ifs.eof() == true ? "TRUE" : "FALSE") << std::endl ; for (int i = 0;i < 4;i++ ){ buf[3 - i] = (unsigned char) ifs.get(); } hoge = (float *)buf; std::cout << (*hoge) <<std::endl; } ifs.close(); return 0; } 92.9388 0.0068334 0.000919042 1.50773e-05 と、期待通り表示された後も ifs.eof()がtrueにならず,続きを読み込もうとして クラッシュします。 どうやって回避するのが普通なのでしょう? #バイト数を先に把握するってのも一つの手かもしれないけど,普通じゃないような気がする
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
- sakusaker7
- ベストアンサー率62% (800/1280)
補足
#include <iostream> #include <fstream> int main () { unsigned char buf[4]; float *hoge; std::ifstream ifs ( "hogefuga.bin" , std::ifstream::in | std::ifstream::binary ); while(true){ for (int i = 0;i < 4;i++ ){ buf[3 - i] = (unsigned char) ifs.get(); } if ( !ifs.eof() ){ hoge = (float *)buf; std::cout << (*hoge) << std::endl; /* エラーは EOFだった時にここで出ているようだ */ }else{ break; } } ifs.close(); return 0; } /* 一応エラーが出なくなったけど、こういうことだろうか? */