• ベストアンサー

ファイル入出力と配列について。

aaa 1 a bbb 2 b ccc 3 c このようなファイルを読み込んで、 配列に入れてたいのですが、 やり方がわかりません。 どなたか教えてください。 お願いします。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

>str系、is系、scanf系は使用しない そういう条件は、始めに提示してもらわないと、質問者も欲しい回答が得られませんし、回答者も無駄足を踏むことになります。orz strtok,strcpy,atoi(リストには挙がってないけど多分、atoiも使えないんだろうってことで?)を置き換えたバージョン もうちょっとエラー処理(配列の範囲を超えてない?とかetc)とか、データの確認(予想したデータか?とか)をした方がいいと思うのでそれは直して下さい。 ------------------------------------------------- #include <stdio.h> #define DATA_MAX 10 #define F1_SIZE 3 #define LINE_SIZE 80 char f1[DATA_MAX][F1_SIZE+1]; int f2[DATA_MAX]; char f3[DATA_MAX]; void main(void){ FILE *fp; char inpbuff[LINE_SIZE]; int rec=0,i; char *pi,*po; fp = fopen( "sample.txt", "r" ); while(NULL!=fgets(inpbuff,LINE_SIZE,fp)){ pi=inpbuff; po=f1[rec]; while(*pi!=' ') *po++=*pi++; *po='\0'; while(*pi==' ')pi++; i=0; while('0'<=*pi && *pi<='9') i=10*i + *pi++ - '0'; f2[rec]=i; while(*pi==' ')pi++; f3[rec++]=*pi; } fclose(fp); for(i=0;i<rec;i++) printf("%s %d %c\n",f1[i],f2[i],f3[i]); }

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

strtokを使って切り出しをするサンプル #include <stdio.h> #include <string.h> #include <stdlib.h> #define DATA_MAX 10 #define F1_SIZE 3 #define LINE_SIZE 80 char f1[DATA_MAX][F1_SIZE+1]; int f2[DATA_MAX]; char f3[DATA_MAX]; void main(void){ FILE *fp; char inpbuff[LINE_SIZE]; int rec=0,i; char *p; fp = fopen( "sample.txt", "r" ); while(NULL!=fgets(inpbuff,LINE_SIZE,fp)){ p=strtok(inpbuff," \t\r\n"); strcpy(f1[rec],p); p=strtok(NULL," \t\r\n"); f2[rec]=atoi(p); p=strtok(NULL," \t\r\n"); f3[rec++]=*p; } fclose(fp); for(i=0;i<rec;i++) printf("%s %d %c\n",f1[i],f2[i],f3[i]); }

youyouma
質問者

補足

わざわざ、ありがとうございます。 実は、大学の課題でして、 教授が、str系、is系、scanf系は使用しないで、 つくれという事なので、困ってます。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>配列は、char,int,charです。 char f1[DATA_MAX][3+1], int f2[DATA_MAX], char f3[DATA_MAX]; ということでしょうか? 特に、f1(1列目のデータ)の文字列の長さが固定長なのかそれとも不定長なのか、不定長だけども、固定サイズでいいのかとか >scanf系を使わないで処理したい #3で言われているように一行入力して、sscanfを使うのが簡単だと思いますが、 scanf系を使わない理由はなんでしょうか?

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.3

fgets等で一行文のデータを得たのならsscanfを使って配列に振り分けてあげればいいだけだと思います。 ちなみに今回の質問は配列とは無関係ですよね?

youyouma
質問者

補足

scanf系を使わないで処理したいので困ってます。

  • real_neo
  • ベストアンサー率12% (10/83)
回答No.2

1行ずつ読んで、isdigit関数の戻り値が真なら、intの配列へ、偽ならcharの配列に入れたら良いでしょう。 文字列の場合は、読み込んだデータに半角スペースが出現したら、NULL終端すれば良いです。

youyouma
質問者

補足

>>1行ずつ読んで、isdigit関数の戻り値が真なら、intの配列へ、偽ならcharの配列に入れたら良いでしょう。 ありがとうございます。 しかし、その部分のプログラムの組み方が分からなくて困ってます。。。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

配列は、どのような配列ですか? 例えば、 char の配列の配列, intの配列, charの配列 とか、 単に、一行丸ごとchar の配列の配列 とか 構造体の配列 とか

youyouma
質問者

補足

簡単に書きすぎました。すみません。 配列は、char,int,charです。 fp = fopen( "sample.txt", "r" );で、 オープンさせたあとに、一個ずつ単語を、 配列に収めていきたいのですが、 その時に、fgetsやfgetc等を使うと思うのですが、 そこの部分での、振り分け方がどうしてもできなくて、質問しました。

関連するQ&A

専門家に質問してみよう