• ベストアンサー

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

テキストファイル: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; のコメントアウトをなくすと実行出来ますが 読み込みエラーとなってしまいます・・・・

関連するQ&A

  • 配列のサイズ変更

    FILE *fp; char *fname = "test.txt"; unsigned char init[300]; int i = 0; int c; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%sファイルが開けません\n", fname ); return -1; } while( (c = fgetc( fp )) != EOF ){ init[i] = c; i = i+1; } fclose( fp ); 自分のプログラムの中のこのようなテキストから文字を読んで配列に格納するような動作の中で、initを大きめにとっておいて配列に格納し終わったら余った空の配列を削除する、という機能を拡張したいのですがどのようにすればいいかわかりません。 どなたか教えていただけないでしょうか?

  • 配列のファイル読み込みの方法

    配列のファイル読み込みの方法が分かりません。一応次に示すプログラムまで作りました。 1       23 2       40 3        : 4        : :        : :        : 5000    4098 というテキストファイルを読み込んで、出力したいです。 #include <stdio.h> int main(void){ FILE *fp; double x[5000]; double y[5000]; if((fp=fopen("demo-10mTorr-30W.txt","r"))==NULL){ printf("ファイルが開けません\n"); } while(fgets(x,5000,fp)!=NULL){ printf("%f %f\n",x,y); } } fclose(fp); return 0; } ・分からない点 配列の読み込み方。 またこれを実行した場合、全て0が出力されてしまいます。 よろしくお願いします。

  • fwriteについて

    #include<stdio.h> int main(void) { FILE* fp; double f[5]={ 3.1, 2.9, 4.2, 3.7, 4.0}; double data; fp=fopen("test.txt","wb"); if(fp==NULL) { printf("text.txtが開けません。"); return 0; } fwrite(f,sizeof(double),5,fp); fclose(fp); }と入力したのでが、test.txtファイルを見ると 文字化けがでて、数値がわかりません。 数値もテキストファイルに出力する方法があったらご教授よろしくお願いします。できたらなぜこのようなことが起きたのか教えてくださるとうれしいです。

  • 何バイトめか調べる

    これは、指定したテキストに整数3があった場合、 ファイル先頭から何バイトか調べるプログラムです。 実行しても何も表示されませんでした。 どこが間違ってるか教えてください。 a.txtに、abcdefghij123  と書かれているとします。   FILE *fp;   int ch,val=3;   fp=fopen("a.txt","rb")   while( !feof (fp) ){      ch=fgetc(fp);      if(ch==val)      printf("%ld", ftell(fp) ); }           fclose(fp);      return 0; }

  • 配列がずれてしまう

    C言語初心者です。 二次配列を組んだのですが、初期では正常に配列に入ったのですが、 次回のループで入っていた筈の数値がズレてしまいます。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; // FILE型構造体 char fname[] = "c:\\tmp\\test.txt"; int f1, f2, f3, f4, f5; int i,p,s; int r_table[1100][4]; //ファイル読み込み用構造体 for(i=0;i<1100;i++){ for(p=0;p<4;p++){ r_table[i][p]=0; } } fp = fopen(fname, "r"); // ファイルを開く。失敗するとNULLを返す。 if(fp == NULL) { printf("%s file not open!\n", fname); return -1; } i=0; while(fscanf(fp, "%d %d %d %d %d", &f1, &f2, &f3, &f4, &f5) != EOF) { //数字の格納 r_table[i][0]=f1; r_table[i][1]=f2; r_table[i][2]=f3; r_table[i][3]=f4; r_table[i][4]=f5; printf("%d %d %d %d %d\n", r_table[i][0],r_table[i][1],r_table[i][2],r_table[i][3],r_table[i][4]); i++; } fclose(fp); // ファイルを閉じる printf("\n"); for(s=0;s<10;s++){ //数字の抜出 10回ループ printf("%d %d %d %d %d\n", r_table[s][0],r_table[s][1],r_table[s][2],r_table[s][3],r_table[s][4]); } return 0; } 実行結果 9 13 14 19 22 1 14 25 29 31 4 12 15 22 25 3 13 18 19 22 2 8 14 17 26 1 3 4 9 16 2 18 19 28 30 9 10 16 17 28 9 13 14 19 1 1 14 25 29 4 4 12 15 22 3 3 13 18 19 2 2 8 14 17 1 1 3 4 9 2 2 18 19 28 9 9 10 16 17 28 どうやら、r_table[s][4]にr_table[s+1][0]が入ってしまっているように見られます。 どの部分が間違っているのかご教示頂けたらと思います。

  • C言語 単語を取得するプログラム

    ファイルからアルファベットをスペース等で区切って取得するプログラムを作成しているのですが、デバグがうまくいきません。 どの部分がプログラム的におかしいか、どうすればよいか教えていただけませんでしょうか。 テキスト I have a pen. if you have a pen, please lend me your pen. abc, def.ghi jkl mno pqr..,stu vwx .yz ソースプログラム #include<stdio.h> #include<string.h> int word(char data[],FILE *fp){ char c; int n=0; data[0]='\0'; while((c=fgetc(fp))!=EOF){ if(c!=' ' && c!=',' && c!='.'){ n=strlen(data); data[n]=c; data[n+1]='\n'; } else return(n); } return(0); } int main(){ FILE *fp; char data[30]; fp=fopen("test.txt","r"); if((fp = fopen("test.txt","r"))==NULL){ printf("no file\n"); exit(1); } while((word(data,fp)!=0)){ printf("%s \n",data); } fclose(fp); return(0); }

  • txtファイルの文字を配列に格納

    ファイル関数を使ってoutput.txt(txtファイル)の文字を配列に格納するプログラムを作っているのですが、配列に文字を入れられない状態です。 ※参考になるページやアドバイスがあれば宜しくお願い致します。 ■プログラム #include <stdio.h> void main(){ int i; int data[10]; FILE *fp; fp = fopen("output.txt","r"); if(fp == NULL){ printf("ファイルが見つかりません。"); }else{ for(i=0;fp != EOF;i++){ data[i] = fgetc( fp ); } } } ■output.txt 001 100 猫A 好きな物 ねこまんま 002 200 猫B 好きな物 キャットフード

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?

  • テキストファイルを読み込み、CSV形式に出力する方法がわかりません!

    KOKUGO_TEN=90 SEITO_NUM=0012 TEST_DATE=1030 というファイルを読み込み 90,0012,1030, と出力したいんですが #Iinclude <stdio.h> type struct{ char kokugo[KOKUGO +1]; char seito[SEITO +1]; char test[TEST +1]; } seiseki; int Intxtfile(seiseki *txtstr, char *ptxt); int Outcsvfile(seiseki *csvstr, char *pcsv); int main(int argc, char *argv[]) { char txtfile[256] char csvfile[256] seiseki filedata; int in = 0; int out = 0; in = Intxtfile(&filedata, txtfile); if(In == -1){ return 1; } out = Outcsvfile(&filedata, csvfile); if(Out == -1){ retrun 1; } return 0; } int Intxtfile(seiseki *txtstr, char *ptxt)   /* テキストファイル読み取り関数*/ { FILE *fp; fp = fopen("moshi.txt", "r"); if(fp == NULL){ puts("ファイルオープンエラー"); return 1; } fclose(fp); return 0; } int Outcsvfile(seiseki *csvstr, char *pcsv) /*CSV出力関数*/ { FILE *fp2; fp2 == fopen("moshi.csv", "w"); if(fp2 == NULL){ puts("ファイルオープンエラー"); return 1; } fprintf(fp2, "%s,%s,%s, \n, csvstr -> kokugo, csvstr -> seito, csvstr -> test); fclose(fp); return 0; } エラー処理は中途半端なんですが、これを開くと ファイルオープンエラーになってしまいます。 どこが間違ってますか? 読み取り関数と出力関数は必要なんですが、もっと簡単な方法はありますか?

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

専門家に質問してみよう