- ベストアンサー
プログラムでtxtファイルを読み込みたいのですが
5 10 15 ・ ・ ・ といった風にtxtファイルに保存されている複数の値を、プログラム上で配列に保存して、その値を使用したいのですが、可能でしょうか? できれば方法を教えてほしいです。よろしくお願いします!
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
質問者さん、こんばんは。 #4です。 > 1行分のテキストを読込むところと、 > 取り出したデータを変換(文字列→数値)するところをもう少し > 詳しく教えてもらえませんか?fgetsやatoiの関数の使い方が良くわからないです・・・ 以下に、#4の 『【1】データ取込み処理』 部分の実際のソース例を記述します。 注)私の開発環境は「Windows98SE+Visual C++ Ver 5.0」となっており、質問者さんご利用の 開発環境で実装されている言語仕様(関数の用法など)とは違う場合がありますので、その辺り は環境に合わせて変更して下さい。 ■ソース例(データ取込み処理部分) //=========================== char tmp[256+2]; //1行テキスト読込み用バッファ char num[20+2]; //数値文字列取り出し用バッファ FILE *fp; //ファイルポインタ(FILE構造体へのポインタ) //【1】データ取込み処理(テキストファイルよりデータを読込み配列に格納する) for ( m=0; m<FNUM; m++ ) //ファイル数分ループ { //・対象ファイルをオープン ................fopen などを使用 if( (fp=fopen(filename[m], "r"))==NULL ){ printf("##Error: ファイルがオープンできませんでした。\n"); return -1; } n = 0; while( fgets(tmp, 256, fp)!=NULL && n<DNUM ) //ファイル終端(最終行) or 規定行数までループ { //・1行分のテキストを読込む ..............fgets, fscanf などを使用 //・データを取り出しデータ変換(文字列→数値)を行なう ...sscanf, atoi などを使用 //・数値変換したデータを配列 compdata[x][x] に格納する sscanf( tmp, "%10s", num ); compdata[m][n++] = atoi(num); } //・対象ファイルをクローズ ................fclose などを使用 fclose(fp); } //=========================== 【P.S.】 >fgetsやatoiの関数の使い方が良くわからないです・・・ これは、ご自分である程度、お調べになった上でのコメントでしょうか? プログラミングに限らず、何か新しい事に取り組む場合は、予めそれなりの書籍・資料等を 準備してから取り組むのが基本だと思うのですが、質問者さんはそうされていないのでしょうか? 関数の用法が解らない場合は、C言語関連の書籍などを入手してお調べになってみて下さい。 あるいは、開発環境をお持ちでしょうから、そのヘルプで検索してみるとか、 または、WEBで検索するなどして、なるべく自己解決できるような方向で取り組まれることを お勧め致します。 ※既にそうなさっているのであれば、申し訳ありません。失言失礼致しました。 ■参考サイト 初心者のためのポイント学習C言語 http://www9.plala.or.jp/sgwr-t/ 同上サイト : ファイル入出力 - fopen、fclose、 fgets http://www9.plala.or.jp/sgwr-t/c/sec17.html#s17-2-3 同上サイト : sscanf http://www9.plala.or.jp/sgwr-t/lib/sscanf.html 同上サイト : 標準入出力関数(1) - scanf http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-3 同上サイト : 標準ライブラリ関数 - atoi、atof、afol http://www9.plala.or.jp/sgwr-t/c/sec07.html#s7-4
その他の回答 (4)
こんにちは。 以下の前提条件であると仮定した場合ですが、下記に処理例を上げてみます。 1)ファイルの数がそれ程多くなく、数が決まっている。 2)ファイルの位置(フォルダ位置)および、ファイル名が決まっている。 3)ファイル内のデータ形式(フォーマット)が一定である。 ・今回の場合、1行につき1データ(整数値)で、行数が決まっている。 ■処理例 ◎テキストファイル内のデータが下記のような構成だと仮定します。 行位置 ファイル1 ファイル2 ファイル3 ・・・・・・ ファイルM 1 5 xx xx xx 2 10 xx xx xx 3 15 xx xx xx : : : : : : : : : : N xx xx xx xx ※データの大小比較は行単位に行なうものとします。 ◎上記のデータ構成を 下記のような 数値配列 に格納するものとします。 #define FNUM xxx //テキストファイルの数 #define DNUM xxx //比較データの数(=1ファイル内のデータ行数) int compdata[FNUM][DNUM]; //比較データの配列(ファイル数×データ数) ◎以下はソースレベルの処理例です(※大まかなやり方のみ記述しています) ・プログラム形式は、コンソールプログラムとします。 ・出力処理は、コンソールへの表示とします。 //データファイル名(ファイル名が決まっている場合はテーブル化しても良いかもしれません) const char* filename[] = { "data1.txt", "data2.txt", "data3.txt", ....... "dataN.txt" }; int n, m; //ループ用変数 int mindata; //最小値格納用 int fno; //ファイル番号格納用 //【1】データ取込み処理(テキストファイルよりデータを読込み配列に格納する) for ( m=0; m<FNUM; m++ ) //ファイル数分ループ { //・対象ファイルをオープン ................fopen などを使用 for() or while() //ファイル終端(最終行) または 規定の行数 までループ { //・1行分のテキストを読込む ..............fgets, fscanf などを使用 // →この処理はfor文、またはwhile文の( )内に含めた方が楽かもしれません。 //・データを取り出しデータ変換(文字列→数値)を行なう ...sscanf, atoi などを使用 //・数値変換したデータを配列 compdata[x][x] に格納する } //・対象ファイルをクローズ ................fclose などを使用 } //【2】データ比較&出力処理 for ( n=0; n<DNUM; n++ ) //データ数分ループ(=1ファイルのデータ行数分) { mindata = compdata[0][n]; //最小値の初期値をセット(1番目のファイルのデータ) fno = 0; //ファイル番号の初期値セット for ( m=1; m<FNUM; m++ ) //ファイル数分ループ { // mindata と compdata[m][n] を比較してより小さい方を mindata に再セット // →その際、ファイル番号をセット(fno = m;) //※なお、mindata と compdata[m][n] が同じ値だった場合は、先方優先か後方優先かを // 選択する必要があります。(大小比較に = を含めるか否か) } // mindata を出力 .........printf などを使用 // ・必要なら、付加情報(対象ファイル名、何番目のデータかなど)を出力する } 以上です。参考になれば幸いです。
補足
1行分のテキストを読込むところと、 取り出したデータを変換(文字列→数値)するところをもう少し 詳しく教えてもらえませんか?fgetsやatoiの関数の使い方が良くわからないです・・・
- snowize
- ベストアンサー率27% (68/245)
参考URLをどうぞ。 ただし読み込んだデータは文字列となっていますので、数字に変換してから使用してくださいね。C言語なんか昔の話過ぎてよく覚えていませんが、sscanf関数でやるのが簡単だったかな?
- Tacosan
- ベストアンサー率23% (3656/15482)
読み込んだ値をどのように使うの?
補足
どのように使うかというと、txtファイルが数個あって、それぞれに複数個の値が同じ数だけ保存されている状態で、まず各txtファイルの値を配列に保存します。そして各txtファイルの1番目のデータの大小を比較して、最も低い値を出力する。同じように2番目3番目・・・と比較していく、というものです。 わかりにくくてすいません。
- Gizensha
- ベストアンサー率34% (207/608)
可能です。 ところで、どのような用途でご利用予定でしょうか。
補足
プログラムを完成させることができました! 丁寧な説明本当にありがとうございました。 確かに FarEyesさんの言うとおり、自分は人に頼りすぎだったと思います。できる限り自分で調べたいと思います。