MATLABのファイル読み込みに関する問題と解決方法

このQ&Aのポイント
  • MATLABでのファイル読み込みに関する問題が発生しています。ファイル名の一部をループさせて読み込もうとした際に、変数の部分が文字化けして読めないというエラーが発生しています。
  • 具体的には、ファイル名がin_1-C110.txtやin_1-C120.txtという形式であり、最初と最後は共通なので、異なる部分をループさせて連続して読もうとしています。
  • しかし、%aの部分が正しく適用されず、ファイル名内の変数の部分が文字化けを起こしています。この問題を解決するための方法を教えていただきたいです。
回答を見る
  • ベストアンサー

MATLABのファイル読み込みに関して

こんにちは,今回MATLABでのファイル読み込みに関して質問したいことがあり書き込みました 現在in_1-C110.txt,in_1-C120.txt,......in_1-C190.txt'というファイルがあり,これらのファイルをまとめて読み込もうとして以下のようなコードを記述しました for a=1:9 %ファイルを読む fin=fopen(['in_1-C1' a '0.txt'],'r');     %a A=fscanf(fin,'%f %f %f %f %f %f %f',[7 inf]); fclose(fin); (略) end このように,ファイル名の最初と最後は共通なので,異なる部分のみをループさせて連続して読もうとしています ところが,この方法だとInvalid fid.と出てしまいます 調べてみると、意図したものでは%aのところが in_1-C110.txt in_1-C120.txt となるはずだったのですが,fscanfを抜いてこのファイル名のところだけ書き出すようにしてみると in_1-C1(変な文字)0.txt in_1-C1(変な文字)0.txt といったような変数の部分が文字化けを起こしていることがわかりました. したがって,ファイルが読めない原因がこれにあるのだと推察したのですが,解決方法がまったくわからない状態です この問題を解決する方法がわかる方がおられましたら,教えていただけないでしょうか?

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

  • ベストアンサー
  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.1

MATLABに限らず、大体の言語ではデータを異なる型として使用する場合、型変換を行わなければいけません。 ご質問では、a(数値)を変換せずにファイル名(文字列)として使おうとしているため、不具合が発生しています。以下のように型変換を行えば問題ないはずです。 fin = fopen(['in_1-C1' num2str(a) '0.txt'], 'r'); あと、このプログラムは、少なくとも以下の3点については修正した方が良いと思います。 (1) ループカウンタを i に変更   特に理由がない場合、大抵のプログラムではループカウンタとして i 以降の英小文字を使用しています。   時間はt、番号はm,n,no、特に回数を数える場合はcountなどを使用する場合もありますが。 (2) fscan関数実行の前に、変数 fin の検査   fopenに失敗すると-1が返ってきているはずです。 (3) fscan関数はエラートラップをかける   ファイルアクセスは、外的な要因(ファイルの移動、改変、削除など)で比較的エラーの発生しやすい処理です。

orochi_t
質問者

お礼

回答ありがとうございました おかげで無事解決できました ただ、num2strではシンタックスエラーとなったため、int2strを使用しました forのデフォルトはintなのだと思われます C++みたいに for(int a=0; a<9;a++) とか書けるとわかりやすいのですが ともあれありがとうございました

関連するQ&A

  • MATLABで配列をファイルへ書き込む方法

    現在MATLABについて勉強しているのですが、配列M(N×N、Nは任意)をファイル(.txtなど)に書き込む方法が分からず困っています。 fid=fopen('matrix.txt','wt'); fprintf(fid,'%6.4f',M); fclose(fid); このように書いているのですが、全要素が1行に並んでしまいます。 N行N列の形で配列をファイルに出力したいのです。 どなたか初心者でも理解できるようご教授お願い致します。

  • matlabでの改行文字について

    matlabでのテキストファイルの書き換えを行いたいのですが,改行文字の検出ができません.(C言語では作れますが,matlabで作りたいのです.) 例として以下のファイル(read.txt)の書き換えの方法を教えてください. start 0 1 2 abcdef 0 1 2 3 4 xyz end 上のファイルにおいて,abcdef以下の01234を他のファイルに書き換えたく,以下のスクリプトを作成しました. Path1='read.txt'; Path2='write.txt'; judge=0; Fid1=fopen(Path1,'rt'); Fid2=fopen(Path2,'wt'); while feof(Fid1)==0 Line=fgets(Fid1); if Line=='\n' judge=0; elseif judge==1 fprintf(Fid2,'%s',Line); end if strcmp(Line,'abcdef\n')==1 judge=1; end end fclose(Fid1); fclose(Fid2); end ここで,知りたいのは「Line=='\n'」と「strcmp(Line,'abcdef\n')==1」の条件文がうまく働いてない理由です.これを実行すると何も書かれてないファイルが作成されます. strncmp(Line,'abcdef',6)とするとこちらはうまく認識しますが,改行文字のみの行の検出はどのようにして行えばよいのでしょうか.

  • Unicodeのファイル読み込みがうまくいきません。。

    下のようなコードで読もうとしているんですが、どうしても文字化けしてしまいます。原因が何なのかさっぱりわかりません。。 分かる方どうかお願いします!開発環境はVC++.NETです。 FILE* fin; wchar_t c; CString ss; if( (fin = fopen( "temp.txt", "r" )) == NULL ){ AfxMessageBox("temp.txtファイルオープンエラー"); exit(1); } fgetws( &c, 2, fin ); ss += c; AfxMessageBox(ss);

  • matlab ファイル名 読み込み

    matlabでファイルを読み込むときに、ファイル名を変数内に格納する方法を教えていただけないでしょうか。 その変数を利用して、出力ファイル名を操作したいと考えています。 宜しくお願いします。

  • ファイル読み込みで一部分書き換えについて

    C++でテキストファイルから先頭の一部分を読み込んで その一部分だけ更新するプログラムを作りたいんですけど どうすればよろしいでしょうか? テキストファイルの中身例(test.txt) AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA これを読み込んで ↓↓↓↓↓↓↓↓ たとえば先頭の三文字だけ変えたいとか(test.txt) BJDAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA これくらいの行数でしたら string s1,s2,s3; fin.open("test.txt"); fin>>s1; fin>>s2; fin>>s3; fin.close(); fout.open("test.txt"); fout<<s1<<"\n"; fout<<s2<<"\n"; fout<<s3<<"\n"; fout.close(); でもなんとかなりそうですけどもっと大量になったときにあまりに 行が長くなりそうなんで他の方法は何かないでしょうか? ちなみに関係あるか分かりませんがコンパイラはVisualC++2005です。

  • MATLABでのデータ保存(for文等で)

    初めて質問させていただきます。 MATLABで以下のようなfor文で1000回まわすとします。 for i=1:1000 c=rand(1000,1); fid=fopen('data1','wt'); fprintf(fid,'%f\n',c); end このままでは、最終的に1000回目のcの値だけがdata1に保存されます。 そうではなく、1~1000回目のcの値をそれぞれ別のファイルとして保存したいと思っております。(できればdata1~data1000という形で) 参考書などを読みあさったのですが、どう組めばいいのかわからず困っています。 for文等で、保存するファイル名の名前を、繰り返す度に変える方法などご存知の方おりましたら教えてください。よろしくおねがいします。

  • ファイルからの読み込み

    ファイルから文字を読み込むプログラミングについての質問です。 ファイルから文字を読み込んで出力したいのですが、ファイルの中身が 1 2 3 a c 3 5 6 ・・・ 1 4 y c d 4 のような感じになっています。各文字と文字の間はスペースで区切られており、2行目の文字はどこまで続くか分かりません。 この場合fscanf,fget関数を使ってファイルを読み込む時どのようなプログラムにしたら良いのでしょうか? 分かりづらい質問ですいません。

  • ファイルからの読み込み

    fscanfを使ってファイルの中身を読み込みたいのですが、ファイルの中身の長さが統一されていない場合どうしたらよいでしょうか? 読み込むファイルの中身 A d 1 B 3 2 G 5 1 2 B 6 G H 5 2 5 今まではファイルの中身の各行の文字数が全部3つだったので fp=fopen(A.txt,"r"); while(fscanf(fp,"%s %s %s",data,data+1,data+2)!=EOF) { printf("%s?n",data); }としていました。わかりにくい文章ですいません。

  • MATLAB

    MATLABについて シュミレーションのプログラムを作成したのですが、保存した名前がいけないのか、 MATLABで開けないFileになってしまいました。 WORDPATで開いても文字化けして読めません。 何か良い方法はないでしょうか・・・ どうしても中身を復活させたいのです。 どなたか解決方法を知っていたら教えてください。

  • matlabのエラー

    座標データが書き込まれたテキストファイルからデータをmatlabで読み込みたいのですが,作成したスクリプトでエラーが出ます.テキストファイルの形式はx,y,z座標がスペース区切りで1行ごとに書き込まれてます.以下作成したスクリプトです. path='coordinate.txt'; fid=fopen(path,'rt'); while feof(fid)==0 Line=fgets(fid); zahyou=sscanf(Line,'%f%f%f'); x(i)=zahyou(1); y(i)=zahyou(2); z(i)=zahyou(3); end fclose(fid); これを実行すると次のエラーメッセージが出ます. Attempted to access (1); index out of bounds because numel(zahyou)=0. エラーが出てるのはx(i)=zahyou(1)で,何がいけないのかさっぱりわかりません. さらにわからないことに,whileをなくして,一番最初の一行だけ読むときは,普通に動きます. 何がいけないのでしょうか.

専門家に質問してみよう