- ベストアンサー
VC6でのファイル入力について
現在、下記のようにしてファイルを読み込もうとしています。 void CSampleDlg::OnButton2() { CString ss,tt,uu; FILE* fp; if( (fp = fopen("test.txt","r")) == NULL ){ exit(1); } fscanf(fp,"%s",ss); fscanf(fp,"%s",tt); fscanf(fp,"%s",uu); fclose(fp); m_edit1.SetWindowText(ss); m_edit2.SetWindowText(tt); m_edit3.SetWindowText(uu); } 読み込む対象となるファイルの内容は、 1 2 3 です。 このプログラムを実行すると3つのエディットボックスに表示されるのは全て同じ値になります。具体的には「3」が表示されます。 1つ目のfscanfの段階でブレークポイントを設けて1行ずつ処理の様子を見ると、 はじめはss="1"ですが、tt="2"となったと同時にss="2"になります。 そして最終的にuu="3"になると、ss="3"、tt="3"になります。 エラーメッセージは特に表示されません。 何がまずいのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
CString ss,tt,uu; fscanf(fp,"%s",ss); fscanf(fp,"%s",tt); fscanf(fp,"%s",uu); としていますが、このとき警告も出ていませんか? というのも、fscanf にCstringを渡すときに型変換が行われていて const char* か void *に変換されていると思うのですが CStringの operator xxxには CString::operator LPCTSTR This casting operator accesses the null-terminated C string contained in a CString object. No characters are copied; only a pointer is returned. Be careful with this operator. If you change a CString object after you have obtained the character pointer, you may cause a reallocation of memory that invalidates the pointer. があるのでこれが使われそうな気がするのですが、実際のところ Cstringの内部のバッファは独自の管理をしているのでそれなりの 手続きをしないとCスタイルの文字列として扱うには問題があったと記憶しています。 CString::GetBuffer http://msdn.microsoft.com/library/ja/wcemfc/htm/cstring_14.asp?frame=true CString::ReleaseBuffer http://msdn.microsoft.com/library/ja/wcemfc/htm/cstring_26.asp?frame=true そもそも > CString ss,tt,uu; という宣言ではデフォルトの最小限度の大きさしかバッファを確保していないはずなので(確か16バイトくらい)、 長い文字列がきたらクラッシュする可能性があります。 ですので、 fscanfでは別途確保したバッファ領域に読み込みを行い、その内容で CStringオブジェクトを作ったほうが良いのではないでしょうか? char buf[80]; fscanf(fp, "%79s", buf); CString ss(buf); fscanf(fp, "%79s", buf); CString tt(buf); fscanf(fp, "%79s", buf); CString uu(buf); とか。 というか、fopenもifstream使うように変えるとかして、Cのライブラリ関数と C++のライブラリを混在して使うのはできるだけ避けたほうが良いと思います。
その他の回答 (1)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★『fscanf』関数の書式を変更すればいいと思います。 ・『fscanf( "%s%s%s%*c", &ss, &tt, &uu );』とすれば3つ正しく読み込めると思います。 ・以上。おわり。
お礼
簡潔でわかりやすい回答ありがとうございます。 参考URLは今後とも役立ちそうです。 ありがとうございます。
補足
簡潔でわかりやすい回答ありがとうございます。 参考URLは今後とも役立ちそうです。 ありがとうございます。
お礼
付加的な情報を含めて回答いただきありがとうございました。 なんとか解決しました。