• ベストアンサー

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
質問者

お礼

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

  • chie65535
  • ベストアンサー率43% (8525/19379)
回答No.6

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

  • chie65535
  • ベストアンサー率43% (8525/19379)
回答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

  • VC++2005 型についてのエラー

    現在VC++2005でプログラムを作成しています。 そこでテキストファイルに書かれて保存されているものをテキストボックスに表示するというものを作っています。 そして今は、ssという変数にその表示されているものを代入してあります。そこでそのssというものと7:00とテキストファイルに書かれているものを比べてみたいと考えています。 そこでstrcmpで比べてif文を作りたいのですが、下に書いたエラーで変換できませんと出てしまいます。 このような場合はどのように修正すればよいのでしょうか? 基本的な質問かもしれませんがよろしくお願いします。 「'strcmp' : 1 番目の引数を 'System::String ^' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)」 **************************************************************** String^ ss; ss=textBox2->Lines[0]; textBox4->Text=ss; if (strcmp(ss, "7:00")==0) { MessageBox::Show("7時"); } else { MessageBox::Show("それ以外"); } ****************************************************************

  • C++/CLIにて、System.String^型からChar*への変換。または、fopen_s以外のファイル出力方法

    現在、VisualC++2005の「空のCRLプロジェクト」からコツコツプログラムを組んでいます。 ファイルを読み込む→処理→他のファイルに結果を出力という単純なプログラムなのですが、入力、出力ファイル名を共に、コンソール画面から入力するというところで困っています。 コンソールから読み込みについては、バッチの利用も考えてmain関数で、  int main(array<String^>^ (変数名)) とし、String^型でファイル名を読み込みました。 しかし、実際にファイルを呼び出す際には、  fopen_s(&fp, (char*型ファイル名) ,"a"); を利用するため、char*型に変換しなければなりません。 ToCharArrayを試しましたが、 'cli::array<Type,dimension> ^' から 'char *' に変換できません。 とエラーが出ますし(過去の質問にもあります)、キャストも同様です。 ファイル名の読み込みをchar*にもしてみましたが、String^にするようにとのエラーが出ました。 何か良い解決方法はないでしょうか。 (1)String^型からChar*へ変換する (2)String^型でファイルを開く(fopen_s以外の)関数を探す などの解決法があると思いますが、どちらでもかまいません。 ご存知の方、よろしくお願いします。 情報が不足していましたら、どのような情報が必要かもお教えください。 よろしくお願いします。

  • 急にプログラムが正しく動かなくなってしまった

    Macのターミナルでcのプログラムを動かしています。 今まで使えていたプログラムが、突然うまく動かなくなりました。 原因が分からないのですが、どなたかアドバイスいただけないでしょうか? プログラムは、 1)ファイル名のリストを読み込んで、 2)読み込んだ名前のバイナリファイルを全て開き 3)それらのファイルからデータを読み込んで処理 というものです。 このプログラムは同じパソコン上でもともと正しく動いていたのですが、あるとき突然、2)の段階で一部のファイルが開けなくなってしまいました。 原因を探るために、ファイルを開いて閉じるだけのプログラムに削ってみましたが、やはり症状は変わりませんでした。 同じプログラムを、別のパソコン(windows+cygwin)にコピーしてみると、ちゃんと動きます。使用中のMacに何か問題があるのかなとおもうのですが、原因が分かりません。 詳しい状況と、開いて閉じるだけの状態に削ったプログラムを以下にのせておきます。どなたか原因が分かる方、ぜひアドバイスをお願いします。 [状況] ・上記2で開きたいバイナリファイルは332個あるのですが、253個しか開けず、それ以降はCannot open (ファイル名)のメッセージが出ます(そういうメッセージを出すようなプログラムにしてあります) ・上記2でfopenの前に、これから開くファイル名を表示させてみると、ファイル名は全て正しく読み込めています。 ・開きたいバイナリデータファイルが壊れていることを想定し、バックアップからコピーし直してみましたが、やはり症状はかわりません。 ・ for (i = 0; i < FILE_NUM; i++) をつかって複数ファイルを開いていますが、最初をi=0とすると1個目から253個目までしかファイルが開けず、最初をi=1とすると、2個目から254個目のファイルまで開けますが、それ以降のファイルはやはり開けません。どういう訳か、253個だけしかファイルが開けないのです。 [プログラム] #include <stdio.h> #include <stdlib.h> #include <string.h> #define FILE_NUM 332 #define DataDir "../N2913S5601W2689E4705" #define FileList "list_BISE3.txt" #define BUFFER 256 main() { char fn[FILE_NUM][BUFFER]; FILE *fp[FILE_NUM], *fi; char buffer[BUFFER]; unsigned short i; char *p; fi = fopen(FileList, "r"); if (!fi) { printf("Cannot Open %s\n",FileList); exit(1); } for (i = 0; i < FILE_NUM; i++) { p = fgets(buffer, BUFFER, fi); if (!p) { break; } p = strchr(buffer,'\n'); if(p != NULL) { *p = '\0'; } sprintf(fn[i], "%s/%s", DataDir, buffer); printf("%s_\n",fn[i]); fp[i] = fopen(fn[i], "rb"); if (!fp[i]) { printf("Cannot Open %s\n", fn[i]); continue; } } fclose(fi); for (i = 0 ; i < FILE_NUM; i++) { fclose(fp[i]); } }

  • MFCで、UTF-8で保存したい

    すいません。 またまた教えて下さい。 MFCで、UTF-8でファイルを保存しようとしていますが、うまくいきません。 下記のプログラムで、添付のエラーが出ます。 // UTF-8ファイル書き込み FILE* pFile1; fopen_s(&pFile1,"C:\\app\\8a.txt", "w, ccs=UTF-8"); //fopen_s(&pFile1,"C:\\app\\8a.txt", "w"); //UTF-8でないのでOK if (pFile1) { CStdioFile file(pFile1); file.WriteString(_T("abcあいうえお")); file.Close(); } <環境> windows8 visual studio2012(2008でも同じでした) MFCで、文字セットはマルチバイト文字セットを使用するにしています。 参考にしたHP http://faithandbrave.hateblo.jp/entry/20080724/1216890457 なぜでしょうか? よろしくお願い致します。

  • VC++2005 テキストボックス

    現在、VC++2005でプログラムをしているのがどうしてもエラーが出てしまうのでわかる方がいればよろしくお願いします。 プログラムとしては、テキストボックスの中のデータが空だった場合にはある処理を行うというものを作っています。 プログラム本体は、 if(textBox1==NULL) { label1->Text="データがありません\n"; } です。 エラーメッセージは、 エラー 1 error C2446: '==' : 'int' 型から'System::Windows::Forms::TextBox ^' 型への変換ができません。 というメッセージが出てしまいます。 このエラーは、型変換が違っているということのエラーなのでしょうか?どのように修正するとよいのでしょうか? 説明などがとても下手かもしれませんが、よろしくお願いします。

  • file関数とファイルポインタ

    ファイルの内容を(書き換えるために一旦)読み込む時に、 fgets関数と違ってfile関数は fopen関数を使わなくても済む、ということで 便利なので使ってみようと思っているのですが、 ちょっと躓いています。 set_file_bufferやflock、rewindが必要なのですが、 これらはどれも引数にファイルポインタを使います。 fopen関数を使っていないのでコレがないのですが、 どうすればいいのでしょうか? fopenのあとにfileを使う? fopenを使わなくても閉じる時にはfcloseが必要? でもfcloseもファイルポインタを使うし… よろしくお願いします。

    • ベストアンサー
    • PHP
  • ASP.NET C#で

    ASP.NET C#で重複登録されないようにStreamReaderで読み込んで確認後重複がなければ StreamWriterで書き込むというプログラムを書いていたのですが、重複確認もcsvファイルへの書き込むもエラーが表示されて出来ませんでした。 sr.Close();の位置を変えても変わりませんでした。 エラー内容 ・System.ObjectDisposedException はユーザー コードによってハンドルされませんでした。 Message=閉じている TextReader から読み取ることはできません。 他にも、他のプロセスに使われているため・・・と言ったエラーも表示されます。 ソースコード protected void Button1_Click(object sender, EventArgs e) { string Searchid = TextBox1.Text;//商品コード //ファイルの存在を確認 if (!File.Exists(MapPath(".") + "\\Data\\product.csv")) { Label2.Text = "データ登録先が存在しません。管理者に連絡してください。"; return; } this.Label1.Text = string.Empty; //確認ここまで StreamReader sr = new StreamReader(MapPath(".") + "\\Data\\product.csv", true); while (sr.Peek() != -1) { string date = sr.ReadLine(); char[] delimiter = new char[] { ',' }; string[] item = date.Split(delimiter); string id = item[0]; sr.Close(); if (Searchid.Equals(id)) { Label1.Text = "既に存在する商品コードです。別の商品コードを指定してください。"; } else { Session["scode"] = TextBox1.Text;//商品コード Session["sname"] = TextBox2.Text;//商品名 Session["price"] = TextBox3.Text;//価格 StreamWriter sw = new StreamWriter(MapPath(".") + "\\Data\\product.csv", true, Encoding.GetEncoding("Shift_jis")); sw.WriteLine(TextBox1.Text + "," + TextBox2.Text + "," + TextBox3.Text);//商品コード+商品名+単価 sw.Close(); Label1.Text = "正常に登録出来ました。"; } } } どのようにしたら実行出来るのでしょうか? 教えて下されば幸いです。

  • 「互換でない型変換」というエラーが出てしまいます。

    ex.filのファイルの中身は以下の通りです。 0103 美空ひばり 川の流れのように 0209 山口百恵 いい日旅立ち 0992 キャンディーズ 危ない土曜日 このデータを構造体「iti」に読み込ませるために 以下のようにしました。 ------------------------ typedef struct itiran_ { char code[5]; char singer[20]; char melody[50]; } itiran; itiran iti; int main(void){ char buf[5]; char buf2[100]; ・ ・ ・ fp = fopen("ex.fil","r"); if(fp == NULL){ exit(1); } i = 0; while(fgets(buf2,sizeof buf2,fp) != NULL) iti[i].code = strtok(buf2," "); ↑ここでエラー iti[i].singer = strtok(NULL," "); iti[i].melody = strtok(NULL,"\n");i++; } ------------------------ 「iti[i].code = strtok(buf2," ");」のところで 「互換でない型変換」というエラーが出てしまいます。 iti[i].codeも buf2も どちらもchar型変数なのに どうしてこのようなエラーになるのかが 分かりません。 ご教示して頂けたら幸いです。

  • 開発期間を短縮したい

    現在ラジオボタンでの選択後に条件分岐するスクリプトを製作しておりますが、if文で製作すると私の場合(駆け出しです。)およそ、見当もつかない位の時間がかかります。そこで皆様方の知恵を頂き開発時間の短縮が出来ればと思い投稿しました。よろしくお願いします。 <内容> (1)値段表示はファイルを読み込んで表示します。200.txtなら、200円と表示です。 (2)前のページより田中、鈴木、小林の値をhiddenで送っています。鈴木さんが購入すると、田中さんより200円UP、小林さんだと、田中さんより300円UPにしています。 1.php (下記のようにグダグダ長い文を書いていくのはあまりにも非効率のような気がしますので皆様方の知恵を拝借させていただきたいと思います。あつかましくて申し訳ございません。) <?php if(c=="田中" && a=="001" && b=="0"){ $file_name="200.txt"; $file=fopen($file_name,"r") or die("OPENエラー $file_name"); $string = fgets($file, 20); echo $string; } elseif(c=="田中" && a=="002" && b=="0"){ $file_name="400.txt"; $file=fopen($file_name,"r") or die("OPENエラー $file_name"); $string = fgets($file, 20); echo $string; } elseif(c=="田中" && a=="0" && b=="010"){ $file_name="600.txt"; $file=fopen($file_name,"r") or die("OPENエラー $file_name"); $string = fgets($file, 20); echo $string; } 以下省略 ?>

    • ベストアンサー
    • PHP
  • ファイルを読み込むプログラムについて

    下のプログラムで分からない所がありますので、教えて頂ければと思います。宜しくお願い致します。 text = fgets(buf,256,fp);はfpのファイルから一行を読み込んでbufに格納するという処理ということは分かります。でも、while文内なので次にこの処理をする時に今度は、2行目(下の段)を読み込むはずですが、プログラム中のどこに2行目に移動させる処理があるのか分かりません。 予想ですが、text = fgets(buf,256,fp);の中にそのような意味の処理が含まれているのでしょうか? どなたかご教授お願い致します。 #include <stdio.h> int main(void) { FILE *fp; char buf[256]; char *text; char flname[256]; printf("ファイル名:"); gets(flname); fp = fopen(flname,"r"); do{ text = fgets(buf,256,fp); if(text != NULL){ printf("%s",text); } }while(text != NULL); fclose(fp); return(0); }