• 締切済み

MFCのファイルの読み込み方について

MFCでファイルを読込むプログラムを作成しているのですが、 例題を丸写しに近い状態で利用したため、変数の意味が分からず、困っております。 以下がそのプログラムなのですが・・・。 /*********************************************************************************************** void CProgramDoc::OnFileRead(CDC *pDC) { // TODO: この位置にコマンド ハンドラ用のコードを追加してください CFileDialog filedlg(TRUE //ファイル読み込みモード , "txt" //デフォルトの拡張子 , NULL //デフォルトで指定するファイル名 , OFN_HIDEREADONLY //オプション指定のフラグ , "グリッドファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*||"); //ファイル名のフィルタ CStdioFile stdfile; ifstream ifs; int Lineindex=0; if( filedlg.DoModal() == IDOK) { //ダイアログを表示し,OKボタンが押されたならば m_sPath = filedlg.GetPathName(); if(stdfile.Open(m_sPath,CFile::modeRead)) { //ファイルを正常に開けた場合 while(stdfile.ReadString(buffer)) { m_pos = NULL; m_strList.AddTail(buffer); Lineindex++; } m_pos = m_strList.GetHeadPosition();//先頭部分の要素の位置を返す m_sKanji = m_strList.GetNext(m_pos); //posの位置を次へ移動させる。漢字取得 m_sRomaji = m_strList.GetNext(m_pos); //ローマ字取得 POSITION pos = GetFirstViewPosition(); stdfile.Close(); } else { AfxMessageBox("ファイルを開くことができませんでした"); } } } //*********************************************************************************************** このプログラムでファイル名を代入している変数は、m_sPath で良いのでしょうか。 そして、例えば、『A.txt』というファイルを読込んだ際、 if(m_sPath=="A.txt") { ------ } と言ったようにファイルの名前が『A.txt』ならばというようなif文を作成することができるのでしょうか? 問題が多岐にわたってしまい、申し訳ございません。 よろしくお願いします。

みんなの回答

回答No.2

こんばんは。だいぶ混乱している様ですので。 >>このプログラムでファイル名を代入している変数は、m_sPath で良いのでしょうか。  はい。  //ダイアログを表示し,OKボタンが押されたならば  m_sPath = filedlg.GetPathName();  ↑この部分でファイルダイアログで選択したファイルへのパス文字列が代入されています。 >>と言ったようにファイルの名前が『A.txt』ならばというようなif文を作成することができるのでしょうか?  はい。  m_sPathの文字列から「ファイル名」の部分を取り出します。m_sPathと言うのは恐らくMFCのCStringの事だと思います。  CStringの操作方法を確認しておいた方が良い筈です。  「CStringT」  http://msdn.microsoft.com/ja-jp/library/abzc9989.aspx  又、処理が必要になる度長々と書く訳にも行かなくなるので、こう行った物は、関数にしまって使いまわす様にします。 //パスを剥がしてファイル名を出力する関数(デバッガで追って変数内などを確認してみて下さい) static const CString StripPath(const CString& sPath) { //\を逆から見つけるposには\の見つかった位置が入る const int pos = sPath.ReverseFind('\\'); //\が見当たらなければposの中は-1が入っている if(pos == -1) return CString(); //\の見つかった位置+1から、右を取り出す CString sFile = sPath.Mid(pos + 1); //大文字に変換する sFile.MakeUpper(); return sFile; } //------------------------------------------------------------ //使用する  //ダイアログを表示し,OKボタンが押されたならば  m_sPath = filedlg.GetPathName();  //変更してはならない物には出来る限りconstキーワードを使用して固定します。  const CString sFile = ::StripPath(m_sPath);  if(sFile == "A.TXT")  {   //ファイル名が一致したのでココで何かする  } //------------------------------------------------------------

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

>このプログラムでファイル名を代入している変数は、m_sPath で良いのでしょうか。 半分正解で、半分不正解。 m_sPathには「ファイル名のみ」ではなく「ドライブ名、パス名、拡張子が付いたファイル名」が入っています。 >そして、例えば、『A.txt』というファイルを読込んだ際、 >if(m_sPath=="A.txt") >{ >------ >} >と言ったようにファイルの名前が『A.txt』ならばというようなif文を作成することができるのでしょうか? 単純にはできません。 それをやるには、m_sPathの内容に含まれている「ドライブ名、パス名、拡張子が付いたファイル名」から「拡張子が付いたファイル名」を取り出し、更に、英字をすべて大文字か小文字に書き換えた上で、目的のファイル名か判断しなければなりません。 例 1.「C:\MyFolder\TextFile\Mydata\a.Txt」から「a.Txt」を取り出す 2.「a.Txt」の英字を全部大文字に書き換え「A.TXT」にする 3.「A.TXT」と比較する ファイル選択ダイアログで「A.txt」と入力して「A.txt」をオープンしようとしても、ファイル名の英字の大文字小文字は同一視されますから、実際に開かれるファイル名は「C:\MyFolder\TextFile\Mydata\a.Txt」とかになっている可能性があります。 なので、上記1~3のような「面倒な前処理」が必要です。

nanami_wic
質問者

補足

ご解答ありがとうございます。 それでは、m_sPath==""C:\MyFolder\TextFile\Mydata\a.txt" としたら、結果として読込めるということでしょうか?

関連するQ&A

  • VC++について

    MFC初心者なのですが、MFCで簡単なタイピングゲームを作成しているのですが、肝心の文字列を処理方法を教えていただけたらと思います。 流れとしては、ファイルから文字列を読込み、 読込んだ文字のローマ字部分と同じ文字を制限時間以内に入力するというゲームです。 制限時間を越えてしまった場合は強制的にゲームを終了します。 void CProgramDoc::OnFileRead(CDC *pDC) というファイルから文字を読込むクラスを作成しました。 ファイルから2行(一行目、漢字、二行目、ローマ字)を1セットとし25セット(全50行)読み込み、全てbufferに一度、格納します。 bufferの型はCStringです。 格納する際は、 strList.AddTail(buffer); で格納しました。 初めのセットのみを表示する際は、 pos = strList.GetHeadPosition();//先頭部分の要素の位置を返す m_sStr0 = strList.GetNext(pos); //posの位置を次へ移動させる m_sStr1 = strList.GetNext(pos); で、m_sStr0、m_sStr1に格納し、 void CProgramView::Moji(CDC *pDC) { CProgramDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->TextOut(180,530,pDoc->m_sStr0); pDC->TextOut(180,560,pDoc->m_sStr1); } で表示することができるのですが、連続的に表示する方法が思いつきません。 この文字セットを何らかのイベント(時間切れ、入力完了)後、次のセットに移行させ表示するための方法を教えてください。

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

  • バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。

    こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #include<stdio.h> int main(){ FILE *fp,*fp2; char str[1024]; //file.txtはバイナリファイルなのでバイナリモードで開く if((fp = fopen("file.txt","rb")) == NULL){ printf("file.txt:open error"); exit(-1); } //out.txtはテキストファイルとして保存したいのでテキストモードで開く if((fp2 = fopen("out.txt","at")) == NULL){ printf("out.txt:open error"); exit(-1); } //一行ずつバイナリファイルをテキストファイルにして保存 while((fgets(str,1024,fp)) != NULL){ printf("%s\n",str); fprintf(fp2,"%s\n",str); } fclose(fp); fclose(fp2); return 0; } ####ここまで#### 以下が出力されたテキストファイル(out.txt)です。 ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI&egrave;&Ccedil; ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI0g 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • バッチファイルで

    バッチファイルでファイル名をキーボードで変更するのは どうすればよいのでしょうか 例:A.txtと言うファイル名をキーボードから2006data.txtにしたいのですが REN C:\A.txt 2006data.txt はわかるのですが2006.txtを変数にして その変数をキーボードで入力する方法(今更バッチファイルでもないのですが?) よろしくお願いします。

  • 行ごとにファイル結合

    下記プログラムは、input1.txtの内容 0 1 2 3 4 5 6 7 8 をファイル入力して、行番号とファイルの内容を表示できるように作成したものです。 このプログラムにinput2.txt 9 10 11 12 13 14 とinput3.txt 15 16 17 をファイル入力し、行ごとに結合して 0 0 1 2 9 10 15 1 3 4 5 11 12 16 2 6 7 8 13 14 17 と表示できるようにしたいのですが、どのようにすればよいのでしょうか。ご存知の方、お手数ですが教えてください。よろしくお願いします。 #include <stdio.h> main(){ int i,j=0,N=0,n,a[100],m=0; FILE *fpi; if((fpi=fopen("input1.txt","r"))==NULL){ fprintf(stderr,"ファイルを開けません。\n"); exit(1); } while(fscanf(fpi,"%d",&a[N])!=EOF && N<100){ N++; } n=N/3; printf("%d",m); for(i=0;i<N;i++){ printf(" %2d",a[i]); j++; if(j==n && m<n-1){ printf("\n"); m++; printf("%d",m); j=0; } } fclose(fpi); }

  • ファイルの入力、出力

    #include<stdio.h> int main(){ int a,b; FILE *fp0, *fp1;   fp0 = fopen("test1.dat", "r"); if( fp0 == NULL ){ printf("Cannot open test1.dat"); exit(1); } fp1 = fopen("file.txt", "w"); while((fscanf(fp0, "%d %d", &a,&b)) != EOF){ fprintf(fp1, "%d %d\n", a*a,b*b); } fclose(fp0); fclose(fp1); return(0); } test1.datファイルを読み込んで、変数a,bに値をいれ、 その二乗結果をfile.txtに書き込むプログラムなのですが test1.datファイルに書き込まれてる値をどのようにa,bに代入されているのかわかりません。 例えば test1.datが 1 2 3 4 5 であると、 file.txtには 1 4 9 16 25 16 と書き込まれています。 test1.datが 1 1 2 2 3 3 であると file.txtには 1 1 4 4 9 9 となっています。 どのように、変数に値が入るのでしょうか??

  • 実験で大量のデータを扱うので質問させてください。

    実験で大量のデータを扱うので質問させてください。 (javaでテキストファイル名を操作する方法に関しての質問です。) ファイルへの出力で、たとえばファイル名を「file_1.txt][file_2.txt]・・・[file_100.txt]といった具合に大量に扱いたい場合に、数値の部分を変数tとおき、以下に示すプログラムイメージのように、ファイル名を全て書かなくて済むようにしたいのですが、javaでそのようなことは可能でしょうか?方法をご存知の方がおられれば教えてください。よろしくお願いします。 (以下のプログラムはC言語でのイメージです。実際こんな書き方はできませんが、やりたいことのイメージをお伝えしたかったので) ///プログラムイメージ//////////////////////////// int t = 0; for(t=0;t<100;t++){ if((fp=fopen("file_t.txt","w"))==NULL){ printf("ファイルが開けません"); exit(1); } fprintf(fp,"%d ",a); //各ファイルにaという実験データを書き込みたい t += 1; fclose(fp); } ///////////////////////////////

    • ベストアンサー
    • Java
  • テキストファイルからの読み込みがうまくできません(>_<)

    C言語初心者の学生です。 読んでいただきありがとうございます。 テキストファイルに数字を並べ、それを読み込んで char型の変数に入れ、さらにatofによってfloat型に変換し、計算に使っていくということがしたいのですが、 テキストファイルの書き方がおかしいのか、プログラムの書き方がおかしいのか、テキストファイルに書いたとおりの値とは異なるおかしな値が表示されます・・・ だいたいのプログラムの書き方は、 char型のa2、float型のa[n][n]、FILE *fpINを定義して if ( (fpIN = fopen("matrix.txt", "r" )) != NULL ){ if ( fgets(a2,sizeof(a2),fpIN) != NULL ){ } fclose( fpIN ); } for(i=0;i<n;i++){ for(j=0;j<n;j++){ a[i][j]=atof(a2); } } というようなものです。 テキストファイルは、数字をカンマで区切ったり、スペースで区切ったりと いろいろ試してみたのですが、やはり書き込んだ値とは異なるものが表示されます・・・ 最終的には、ひとつのテキストファイルに 複数の行列のための値を書き込んでおき、それを読み込んで計算させるということをしたいのです・・・ どなたか、正しく値が読み込まれない原因が分かりましたら、教えていただければと思います。 お手数をおかけしてすみませんが、よろしくお願いします。

  • プログラミングの問題が分かりません。どなたか助けて

    こんな問題が出たのですがまったくもってわかりませんだれか助けてください センサーから入力される符号付き8ビット(char)の入力を一定期間ため込み,値が入力される度に,その平均値を計算し続けるシステムを考える.実装の方法にはいろいろ種類があるが,ここでは,配列をリングバッファとして利用する.リングバッファは,実際にデータを蓄える buffer という名の char 型の配列,最後にサンプル値を代入した位置を示す変数 pos という名の int 型の変数および現在のデータの総和を示す int 型変数 sum を要素に持つ構造体で作成する.リングバッファに値が挿入されるときは,以下の作業を行う. pos を一つ増やす pos がバッファのサイズを超えていたら pos を 0 にする sum から pos の位置のバッファの値を引く リングバッファに挿入したい値を pos の位置のバッファに書く 今挿入した値を sum に足す sum をバッファの長さで割り算して平均値を出力する ここでは,効果的な計算のために,リングバッファのサイズを 128 とする.そのため,変数 pos は 0 から 127 までの値を持つことになる. という問題でこのプログラムを書いてみたいのですがわかりません どなたか教えてくれませんか?

  • ファイルを開きたいのですが、うまくいかなくて困っています。

    ファイルを開きたいのですが、うまくいかなくて困っています。 以下のソースですが、デバッグしながらやっているので謎な部分があるかもしれません。 やりたいこと: ・実行ボタンを押すと"data/test.txt"を開き、OK部の処理に入りたい。 現状: ・参照ボタンを押した後、ファイル選択ダイアログで[開く]を押した後、実行ボタンを押すとエラー ・参照ボタンを押した後、ファイル選択ダイアログで[キャンセル]を押した後、実行ボタンを押すとOK ・"data/test.txt"は存在します。"r"を"w"にして作成してみたりした為、間違いないと思います。 VC++(MFC)でプログラミングしています。 自力解決が難しい為、お力を貸してくださいm(__)m [環境] OS: Windows XP SP3 tools: VisualStudio2008 //**************************************************************** // 参照ボタン //**************************************************************** void CMergeFile::OnBnClickedButtonRef02() { static char BASED_CODE szFilter[] = "Text Files(*.txt)|*.txt|All Files(*.*)|*.*||"; // ファイルの指定を行う CFileDialog dlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST, zFilter, NULL ); dlg.m_ofn.lpstrTitle = "取り込むファイルを選択"; // OKボタンが押されたかチェックする if( dlg.DoModal() == IDOK ){ // ファイル名称クリア処理 ※fileNameはメンバ変数として外に持っています。 memset( fileName, '\0', sizeof(fileName) ); // ファイル名を取得する strcpy( fileName,dlg.GetPathName()); } else { return; } // 選択ファイル名を表示する m_edit_filepath.SetWindowText(fileName); } //**************************************************************** // 実行ボタン //**************************************************************** void CMergeFile::OnBnClickedButtonExe02() { FILE *fpBase = 0; fpBase = fopen("data/test.txt", "r"); if ( fpBase == NULL ){ MessageBox("err"); // エラー } else { MessageBox("ok"); // OK fclose(fpBase); } }