電子書籍の厳選無料作品が豊富!

テキストファイルを開いて、そのファイルの中身を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 *' に変換できません。
どのように直せばよいのでしょうか?

A 回答 (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";
}
+------------------------------------------------------------------------+
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2008/12/27 19:42

 ↓確かに此れは良くなかったですな。


 textBox1->Text = "p1.txt";
 textBox1->Textに読み出した結果を入れて、textBox2を廃止して、ファイル名を取り込むのに
 「OpenFileDialog」
 http://msdn.microsoft.com/ja-jp/library/system.w …
 を使用して見ては?

 後、
>>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.s …

 但し、C++標準の文字列クラスには存在します。此方の事なのでは?
 http://www.sgi.com/tech/stl/basic_string.html

 マネージドのストリングクラスからchar*等を取り出すには、少なくとも
 http://msdn.microsoft.com/ja-jp/library/bb384865 …
 又は
 http://msdn.microsoft.com/ja-jp/library/system.r …
 をする必要があります。可能な限り避けた方が良さそうです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/27 19:41

追記。



それ以前に、textBox1とtextBox2の役目が判らない。bufferがchar配列とStringと両方ある意味も判らない。

プログラムで何をさせたいのか判らない。

コンパイラが吐くエラーの事はひとまず忘れて、まず「このプログラムに何をさせたいのか」を補足して下さい。例えば「textBox▽にファイル名が○○と入っているので、そのファイルを開いて、ファイルのなかに××というデータが、こういう形式で入っているから、その××をtextBox△に表示したい」と言う感じで。

質問文のままでは、プログラムが「何をさせたいのか意味不明」で、このままでは「単にエラーを出さないようにするだけの修正で、意味不明なプログラムが意味不明のまま放置してしまうしかない回答」しか出来ません。
    • good
    • 0

pFile=fopen("p1.txt","r");


pFile=textBox1->Text;

pFile=fopen(textBox1->Text.c_str(),"r");
なのじゃないかと、小1時間問い詰めたい。

どっかに
textBox1->Text="p1.txt";
とかって、初期化を入れておくのを忘れてしまうと動かなくなる諸刃の剣。
    • good
    • 0

マネージド(.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;のところのようなのですが
そこでも同じような考え方でよいのでしょうか?

補足日時:2008/12/23 15:56
    • good
    • 0

とりあえず


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

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!