- ベストアンサー
ファイル入出力と配列について。
aaa 1 a bbb 2 b ccc 3 c このようなファイルを読み込んで、 配列に入れてたいのですが、 やり方がわかりません。 どなたか教えてください。 お願いします。
- みんなの回答 (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)
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]); }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>配列は、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)
fgets等で一行文のデータを得たのならsscanfを使って配列に振り分けてあげればいいだけだと思います。 ちなみに今回の質問は配列とは無関係ですよね?
補足
scanf系を使わないで処理したいので困ってます。
- real_neo
- ベストアンサー率12% (10/83)
1行ずつ読んで、isdigit関数の戻り値が真なら、intの配列へ、偽ならcharの配列に入れたら良いでしょう。 文字列の場合は、読み込んだデータに半角スペースが出現したら、NULL終端すれば良いです。
補足
>>1行ずつ読んで、isdigit関数の戻り値が真なら、intの配列へ、偽ならcharの配列に入れたら良いでしょう。 ありがとうございます。 しかし、その部分のプログラムの組み方が分からなくて困ってます。。。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
配列は、どのような配列ですか? 例えば、 char の配列の配列, intの配列, charの配列 とか、 単に、一行丸ごとchar の配列の配列 とか 構造体の配列 とか
補足
簡単に書きすぎました。すみません。 配列は、char,int,charです。 fp = fopen( "sample.txt", "r" );で、 オープンさせたあとに、一個ずつ単語を、 配列に収めていきたいのですが、 その時に、fgetsやfgetc等を使うと思うのですが、 そこの部分での、振り分け方がどうしてもできなくて、質問しました。
補足
わざわざ、ありがとうございます。 実は、大学の課題でして、 教授が、str系、is系、scanf系は使用しないで、 つくれという事なので、困ってます。