• ベストアンサー

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

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

  • Re,ファイル入出力と配列について。 ごめんなさい。

    aaa  1  a bbb  2  b ccc  3  c このようなファイルを読み込んで、 配列に入れて、 1  a  aaa 2  b  bbb 3  c  ccc のように、 位置を変えて出力したいのですが、 やり方がわかりません。 ちなみに、空白はタブです。 二回も同じ質問してしまい、大変申し訳ございません。 課題の問題を良く見たら、ポインタも使ってはいけないとのことでした。 str系、is系、fscanf等の標準ライブラリ関数を使わないで処理をし、 また、if等の制御文を駆使して、処理しなくてはいけません。 つまり、基礎的な事でプログラムを組めというわけです。 大変恐れ入りますがよろしくお願いします。 先程、お世話になった方々、誠にありがとうございました。

  • 配列の組み合わせを数える方法

    配列の組み合わせを数えるイイ方法はないでしょうか? たとえば ArrayA[]={"aaa","bbb","aaa","ccc","bbb","aaa"} ArrayB[]={"1","1","1","2","1","2"} ↑の配列があるとして、 aaa - 1 : 2個 aaa - 2 : 1個 bbb - 1 : 2個 ccc - 2 : 1個 と組み合わせの数を数えることができる方法で悩んでいます。 Strtusを用いて作成しています。 よろしくお願いします。

    • ベストアンサー
    • Java
  • CSVファイルの指定部分をエクセルに取り込みたい

    複数のCSVファイルをエクセルに、VBAを使用して取り込みます。 CSVファイルの形式は決まっているのですが、キーワード行から指定行分のみを取り込みたいです。 データ形式は、 A1 aaa bbb ccc B1 aaa bbb ccc C1 aaa bbb ccc A1 a1a b1b c1c  :  : という感じで、キーワードA1行以下から次のキーワードより上のデータをエクセルに取り込みたいです。 どうぞよろしくお願いいたします。

  • 配列のソート

    教えていただけますか? 一つの配列にサイズの異なるオブジェクトがいくつか入っています。 もう一方にもサイズの異なるオブジェクトがいくつか入っています。 双方の配列内のオブジェクトは同一ではありません。 しかしサイズが同一の異なるオブジェクトが対として入っています。 双方配列内のオブジェクトを同じサイズの順番で並ぶように、片方の配列の順番を並べ替えるにはどのようなアルゴリズムがよいのでしょうか? よろしくお願いします。 例 配列A (aaa:size5) (bbb:size3) (ccc:size2) (ddd:size9) 配列B (ppp:size9) (qqq:size3) (rrr:size2) (sss:size5) を 配列A (aaa:size5) (bbb:size3) (ccc:size2) (ddd:size9) 配列B (sss:size5) (qqq:size3) (rrr:size2) (ppp:size9)

  • awkで二つのファイルを比較し出力する方法

    UNIXで二つのファイルを使って別ファイルを出力する 処理をしたいのですが、awkで二つのファイルを扱う方法 が分かりませんでした。 やりたい処理は以下のような事です。 ファイルAの1行目"AAA B"と同じ行がファイルBにあったら、ファイルAの"AAA B"の次の行に、 ファイルBの次の行"YYY bbb"を挟み込みます。 もし、ファイルBに同じ行がなかったら、 ファイルAの次の行に"NG"を挟み込みます。 [ファイルA] AAA B ZZZ B AAA C ZZZ C AAA D ZZZ D [ファイルB] AAA B YYY bbb AAA C YYY bbb [出力ファイル] AAA B YYY bbb ZZZ B AAA C YYY ccc ZZZ C AAA D NG どなたか良いスクリプトありましたら 教えていただけないでしょうか。 よろしくお願いします。

  • 配列の移動

    TEXTファイルに文字列を書き込んだり削除したり移動したりするプログラムを作成していますが、 aaa bbb ccc ddd eee fff ggg hhh iii このような内容を 1,aaa bbb ccc 2,ddd eee fff 3,ggg hhh iii のように上から順番に配列化して番号を指定して移動させたいのですが、 3の配列を2の上(配列1と配列2の間)や下(配列2と配列3の間)に移動するのにはどのようにしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • バッチファイルでファイルを比較後他のフォルダにコピ

    次のようなファイル構成で C:\AAA     C:\BBB   \ccc      \ccc    abc.txt    abc.txt    def.jpg    def.jpg   \ddd      \ddd    ghi.txt    ghi.txt    jkl.jpg    jkl.jpg C:AAA\ccc\abc.txt と C:BBB\ccc\abc.txt を比較 C:AAA\ccc\def.jpg と C:BBB\ccc\def.jpg を比較 C:AAA\ddd\ghi.txt と C:BBB\ddd\ghi.txt を比較 C:AAA\ddd\jkl.jpg と C:BBB\ddd\jkl.jpg を比較 全てのファイルに対し比較後C:\CCC(別のフォルダ)に階層を含めコピーしたく for /R %%A in ("C:\AAA") do for /R %%B in ("C:\BBB") do if %%~zA NEQ %%~zB (goto A) :A echo NEQ としましたがループしてしまいました 比較後C:\CCC(別のフォルダ)に階層を含めコピーする方法も含め ご教授をい願いします

  • vbs csv編集 プログラム

    vbsで以下のように編集したいです。 <編集前>    A     B      C 1 aaa@aaa.jp bbb@bbb.jp ccc@ccc.jp 2       bbb@bbb.jp ccc@ccc.jp 3             ccc@ccc.jp <編集後>    A     B      C      D 1 aaa@aaa.jp aaa@aaa.jp bbb@bbb.jp ccc@ccc.jp 2 bbb@bbb.jp       bbb@bbb.jp ccc@ccc.jp 3 ccc@ccc.jp             ccc@ccc.jp <編集後> (1)A列に値がある場合は、その値をA列にコピーする。 (2)A列に値がなく、B列に値がある場合は、その値をA列にコピーする。 (3)B列に値がなく、C列に値がある場合は、その値をA列のコピーする ※A、B、C列すべてに値がある場合は、A列の値をA列(編集後)にコピーする。 上記可能でしたら、コードのご教示お願いいたします。

  • 'id'を無視して、外部ファイルを読み込むには?

    MySQLでデータベースを作成しています。テーブルを以下のように作成しました。 create table table_name (     id MEDIUMINT NOT NULL AUTO_INCREMENT,     aaa text,     bbb text,     ccc text,     PRIMARY KEY (id) ); そして、以下のようなファイル(/root/file)を読み込みます。(尚、ファイルはLinux上で作成しました。) [/root/file] a1,b1,c1 a2,b2,c2 a3,b3,c3 そして、データベース上で以下のようなコマンドを実行しました。 load data local infile '/root/file' into table table_name fields terminated by ',' lines terminated by '\n'; すると、以下のような結果が得られます。 +----+-----+-----+------+ | id | aaa | bbb | ccc | +----+-----+-----+------+ | a1 | b1 | c1 | NULL | | a2 | b2 | c2 | NULL | | a3 | b3 | c3 | NULL | +----+-----+-----+------+ 以下のようにテーブルを作り直すことなく、 create table table_name (     aaa text,     bbb text,     ccc text,     id MEDIUMINT NOT NULL AUTO_INCREMENT,     PRIMARY KEY (id) ); また、以下のようにファイルを書くことなく、 [/root/file] ,a1,b1,c1 ,a2,b2,c2 ,a3,b3,c3 以下のような結果を出すにはどのようにすればよいのでしょうか。(つまり、自動的に作成される'id'を無視するにはどうすればよいのでしょうか。) +----+-----+-----+-----+ | id | aaa | bbb | ccc | +----+-----+-----+-----+ | 1 | a1 | b1 | c1 | | 2 | a2 | b2 | c2 | | 3 | a3 | b3 | c3 | +----+-----+-----+-----+ よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 配列に入っている値のソート

    str(1)="bbb" str(2)="aaa" str(3)="ddd" str(4)="eee" str(5)="ccc" という配列があるとします。 これを昇順にソートさせて、 str(1)="aaa" str(2)="bbb" str(3)="ccc" str(4)="ddd" str(5)="eee" とさせたいのですが、どのようにすればよろしいでしょうか?

専門家に質問してみよう