• ベストアンサー

テキスト→配列化→ソートをしたいのですが

テキストファイル:test.txt 内容:カンマで区切られた数値で最大20個 を読み込んで配列に組み込んでその配列を昇順ソートする。 と言うC言語の課題が内定先の企業より出題されたのですが 今まではC#やデータベース中心だったので 全く解らず困っています。 #include <stdio.h> int main(void) { /* ファイルポインタ */ FILE *fp; int f; fp = fopen( "test.txt", "r" ); if( fp == NULL ) { puts( "test.txtが開けません" ); return 1; } while( 1 ) { f = fgetc( fp ); if( ferror( fp ) ) { /* fgetc関数に対するエラーチェック */ puts( "読み込み中にエラーが発生しました" ); fclose( fp ); return 1; } else if( feof( fp ) ) { break; } printf( "%c", f ); } printf( "\n" ); fclose( fp ); return 0; } } 他のサイト等を参考にファイルを読み込むまでは出来たのですが そこから先が全くわかりません・・・・orz どうかよろしくお願いしますm(_ _)m

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

No.3 です(回答の冒頭部分しか見てもらえず・・残念)。  回答の中程を再掲。 >>なお、「// ファイル1行入力」部分は、 >>while( NULL != fgets( cBuf, 256, fp ) ){ とするのがよろしいかと・・。  の fgets() で cBuf[] に読み込みます(=「入れる」)。  質問者様は、f = fgetc( fp ); で「1文字」読み込んでいます。  fgets() は「1行」読み込みます。  while() の「条件」とすることで、テキストファイルの終了まで読み込みます。  その際、 int iVal[ 10 ]; の 10 は、適宜変更する必要があります。 なお、回答には「ソート」についてもふれています、気が向いたら見て下さい。 回答最下行のURLも気が向いたら見て下さい。 まだまだ先があり、大変ですね(・・でもないか?)。 ☆今回の課題が、「内定」の体の良い「取り消し」に使われなければいいですね。

neko-tiger
質問者

お礼

まだ出来たわけではありませんがありがとうございました。

neko-tiger
質問者

補足

>(回答の冒頭部分しか見てもらえず・・残念)。 すみません・・・・ ------------------ 補足 textファイルの中身を詳しく記載させるのを忘れてました。 10,5,2,9,8,3,4,1,16,30,87,53,23,92,64,32,9,7,18,20 ------------------ と言う事は #include<stdio.h> #include<stdlib.h> #include<string.h> void main( void ) { int iVal[ 39 ];// 「配列」 int nn = 0, i; char cBuf[ 256 ];// ファイル1行模倣 char *p; /* ファイルポインタ */ FILE *fp; fp = fopen( "test.txt", "r" ); if( fp == NULL ) { puts( "test.txtが開けません" ); return 1; } // ファイル1行入力 p = cBuf; while( NULL != ( fgets( cBuf, 256, fp ) ) ) {// 切り分け iVal[ nn++ ] = atoi( fgets );// 数値化 p = 0x00; for( i = 0; i < nn; i++) printf( "%d\n", iVal[ i ] ); } fclose(fp); } でよろしいのでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

>テキストファイル:test.txt >内容:カンマで区切られた数値で最大20個 >を読み込んで配列に組み込んでその配列を昇順ソートする。 > ・ >他のサイト等を参考にファイルを読み込むまでは出来たのですが  http://okwave.jp/qa4538335.html の質問者様と同様、「ファイルを読み込んで一行そのまま表示してしまう状況」ですね。  この質問への拙稿(#4)のような、     ・カンマまでの「文字列」を「数値化」し、「配列」に代入する  方法もあります。  なお、「// ファイル1行入力」部分は、    while( NULL != fgets( cBuf, 256, fp ) ){ とするのがよろしいかと・・。 「ソート」については、上での説明の手法(バブルソート)とは異なりますが、最近、  http://okwave.jp/qa4557292.html という「質問」がありました。  これを使うのがよろしいかと・・。 -------------------------------------- ( No.1 さんへの補足) >29行目> if ( 1 == ( sts = fscanf( "%d,", &f ) ) ) { >30行目> arData[nCnt] = f; >31行目> nCnt++; >の部分でつまずきます。 >int f; のコメントアウトをなくすと実行出来ますが >読み込みエラーとなってしまいます・・・・  それは、29行目について出る「警告」を無視し、実行したからです。  標準ライブラリ関数( fscanf )の「引数」について、調べてみましょう( fp は?)。  http://www.bohyoh.com/CandCPP/C/Library/index.html

neko-tiger
質問者

補足

回答ありがとうございます。 紹介してもらった質問への回答を見てみましたが テキストファイルの内容を char cBuf[ 256 ] = ;の部分に入れるにはどうしたら良いのでしょうか?

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

すみません これはうっかりミスです ・・・ int f; を生かすか または     if ( 1 == ( sts = fscanf( "%d,", &arData[nCnt] ) ) ) {         nCnt++;     } else { といった具合にしてください

neko-tiger
質問者

補足

やはり読み込みエラーになってしまいます・・・・

すると、全ての回答が全文表示されます。
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

配列の読み込みましょう #include <stdio.h> int main(void) {   /* ファイルポインタ */   FILE *fp;   // int f;   int arData[20], nCnt, n, sts;   // 配列の初期化   for( n = 0; n < 20; n++ ) {     arData[n] = 0;   }   fp = fopen( "test.txt", "r" );   if( fp == NULL )   {     puts( "test.txtが開けません" );     return 1;   }   // while( 1 )   // 読み込み個数のカウンタの初期化   nCnt = 0;   // 無限ループはやめる   while( nCnt < 20 )   {     // fgetcでは文字での取り込みなので仕様と違う     // f = fgetc( fp );     //     if ( 1 == ( sts = fscanf( "%d,", &f ) ) ) {         arData[nCnt] = f;         nCnt++;     } else {       // fscanfの戻り値を判定       if ( sts == 0 ) {         fclose(fp);         puts( "読み込みエラー" );         return 2;       }       // データの終端まで行った場合       break;     }   }   fclose( fp );   // ここにソートルーチン   // 出力ルーチン   for( n = 0; n < nCnt; n++ ) {     printf( "%d - %d\n", n, arData[n] );   } } といった具合でしょう

neko-tiger
質問者

お礼

まだ出来ていませんがありがとうございました。

neko-tiger
質問者

補足

回答ありがとうございます。 早速その状態で実行してみましたが 7行目> //int f; 29行目> if ( 1 == ( sts = fscanf( "%d,", &f ) ) ) { 30行目> arData[nCnt] = f; 31行目> nCnt++; の部分でつまずきます。 int f; のコメントアウトをなくすと実行出来ますが 読み込みエラーとなってしまいます・・・・

すると、全ての回答が全文表示されます。
TD-07KVアダプターの海外使用法
このQ&Aのポイント
  • TD-07KVアダプターを海外で使用する際の疑問点について。
  • インドネシアの家庭用コンセントでの240V使用に関する注意点。
  • 変圧器の必要性と推奨ワット数を確認したい。
回答を見る

専門家に質問してみよう