• ベストアンサー

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 *' に変換できません。 どのように直せばよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 こんばんは。  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"; } +------------------------------------------------------------------------+

xxmajimaji
質問者

お礼

ありがとうございます。

その他の回答 (6)

回答No.7

 ↓確かに此れは良くなかったですな。  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  をする必要があります。可能な限り避けた方が良さそうです。

xxmajimaji
質問者

お礼

なんとかできました、ありがとうございます。

回答No.6

追記。 それ以前に、textBox1とtextBox2の役目が判らない。bufferがchar配列とStringと両方ある意味も判らない。 プログラムで何をさせたいのか判らない。 コンパイラが吐くエラーの事はひとまず忘れて、まず「このプログラムに何をさせたいのか」を補足して下さい。例えば「textBox▽にファイル名が○○と入っているので、そのファイルを開いて、ファイルのなかに××というデータが、こういう形式で入っているから、その××をtextBox△に表示したい」と言う感じで。 質問文のままでは、プログラムが「何をさせたいのか意味不明」で、このままでは「単にエラーを出さないようにするだけの修正で、意味不明なプログラムが意味不明のまま放置してしまうしかない回答」しか出来ません。

回答No.5

pFile=fopen("p1.txt","r"); pFile=textBox1->Text; は pFile=fopen(textBox1->Text.c_str(),"r"); なのじゃないかと、小1時間問い詰めたい。 どっかに textBox1->Text="p1.txt"; とかって、初期化を入れておくのを忘れてしまうと動かなくなる諸刃の剣。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

マネージド(.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クラスで入出力を組む方向だと思います

xxmajimaji
質問者

補足

ありがとうございます。 しかしエラーの場所を書き忘れてしまったのですみません。 エラーの場所はpFile=textBox1->Text;のところのようなのですが そこでも同じような考え方でよいのでしょうか?

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

とりあえず pFile=textBox1->Text; を削除したらそのエラーは消えると思います

noname#208124
noname#208124
回答No.1

FILEはオブジェクト指向なものじゃないのでfwrite使え、としか言いようがありません

関連するQ&A