- ベストアンサー
VC++2005 型変換
テキストファイルを開いて、そのファイルの中身をfgetsで読みながらそれを何回か繰り返すというようなことをするというプログラムを書いてます。プログラムは下になります。 int m; FILE* pFile; char buffer[128]; pFile=fopen("p1.txt","r"); pFile=textBox1->Text; if (pFile==NULL) { label1->Text="ファイルがありません。\n"; } for(m=1; m<=8; m++) { fgets(buffer,128,pFile); String^ buffer; buffer=textBox2->Text; } } デバックを行うと次のエラーが出てしまいます。 error C2440: '=' : 'System::String ^' から 'FILE *' に変換できません。 どのように直せばよいのでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 pFile=textBox1->Text; pFileがアンマネージド、textBox1->Textがマネージドです。 仮に互換しても「ファイルポインタ」と「文字列」の違いがあるので、あらぬ代入と言う事になります。 この際マネージドにした方が手っ取り早いと思います。p1.txtはUNICODEでセーブしておいてください。 //ファイル名を入れておく textBox1->Text = "p1.txt"; +------------------------------------------------------------------------+ //まとめて読み取る StreamReader^ streamReader = gcnew StreamReader(textBox1->Text); textBox2->Text = streamReader->ReadToEnd(); +------------------------------------------------------------------------+ //一行ずつ読み取りたければこっち StreamReader^ streamReader = gcnew StreamReader(textBox1->Text); while(!streamReader->EndOfStream) { textBox2->Text += streamReader->ReadLine(); textBox2->Text += "\r\n"; } +------------------------------------------------------------------------+
その他の回答 (6)
- machongola
- ベストアンサー率60% (434/720)
↓確かに此れは良くなかったですな。 textBox1->Text = "p1.txt"; textBox1->Textに読み出した結果を入れて、textBox2を廃止して、ファイル名を取り込むのに 「OpenFileDialog」 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.openfiledialog_members(VS.80).aspx を使用して見ては? 後、 >>pFile=fopen("p1.txt","r"); >>pFile=textBox1->Text; >>は >>pFile=fopen(textBox1->Text.c_str(),"r"); と言う事で1時間程「詰問」するとの事ですが、 textBox1->Textはマネージドのストリングクラスですので(実際にはSystem::String^型)、このクラスには、c_str()と言うメンバ関数は存在しません。 http://msdn.microsoft.com/ja-jp/library/system.string_members(VS.80).aspx 但し、C++標準の文字列クラスには存在します。此方の事なのでは? http://www.sgi.com/tech/stl/basic_string.html マネージドのストリングクラスからchar*等を取り出すには、少なくとも http://msdn.microsoft.com/ja-jp/library/bb384865.aspx 又は http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.marshal_members(VS.80).aspx をする必要があります。可能な限り避けた方が良さそうです。
お礼
なんとかできました、ありがとうございます。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
追記。 それ以前に、textBox1とtextBox2の役目が判らない。bufferがchar配列とStringと両方ある意味も判らない。 プログラムで何をさせたいのか判らない。 コンパイラが吐くエラーの事はひとまず忘れて、まず「このプログラムに何をさせたいのか」を補足して下さい。例えば「textBox▽にファイル名が○○と入っているので、そのファイルを開いて、ファイルのなかに××というデータが、こういう形式で入っているから、その××をtextBox△に表示したい」と言う感じで。 質問文のままでは、プログラムが「何をさせたいのか意味不明」で、このままでは「単にエラーを出さないようにするだけの修正で、意味不明なプログラムが意味不明のまま放置してしまうしかない回答」しか出来ません。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
pFile=fopen("p1.txt","r"); pFile=textBox1->Text; は pFile=fopen(textBox1->Text.c_str(),"r"); なのじゃないかと、小1時間問い詰めたい。 どっかに textBox1->Text="p1.txt"; とかって、初期化を入れておくのを忘れてしまうと動かなくなる諸刃の剣。
- redfox63
- ベストアンサー率71% (1325/1856)
マネージド(.NET:CLR)とアンマネージド(ネイティブ:ランタイム)をごちゃ混ぜに使わないほうがいいですよ System::Stringクラスをそのままfgetsには使えませんので fgets用のchar(または wchar_t)型の配列を準備してこれに読み込みます その後で String型に変換しましょう TCHAR buffer[128]; fgets( buffer, sizeof( buffer ), pFile ); String^ buf = gcnew String( buffer ); textBox2->Text = buf; といった具合でしょう 本来は System.IO.FileStreamクラスで入出力を組む方向だと思います
補足
ありがとうございます。 しかしエラーの場所を書き忘れてしまったのですみません。 エラーの場所はpFile=textBox1->Text;のところのようなのですが そこでも同じような考え方でよいのでしょうか?
- php504
- ベストアンサー率42% (926/2160)
とりあえず pFile=textBox1->Text; を削除したらそのエラーは消えると思います
FILEはオブジェクト指向なものじゃないのでfwrite使え、としか言いようがありません
お礼
ありがとうございます。