• ベストアンサー

C言語 テキストファイルの文字列を配列に代入したい

aaa.txt というテキストファイルがあり、その中身が 8 5 21 13 であるとします(1行のみ)。 main関数内で宣言した整数の配列、 int A[10]; に対して、 A[0]=8 A[1]=5 A[2]=21 A[3]=13 のように代入したいのですが、どのファイルポインタの関数を使ってどのように書けばいいのかわかりません。 ご教授お願いします。

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

  • ベストアンサー
  • gonbee774
  • ベストアンサー率38% (198/511)
回答No.1

最良の方法かどうかはわかりませんが、fscanf()で、書式「%d」を使えばできますね。 #include <stdio.h> main() {   int A[10];   FILE *fp;   fp = fopen("data.dat","r");   fscanf(fp, "%d",&A[0]);   fscanf(fp, "%d",&A[1]);   fscanf(fp, "%d",&A[2]);   fscanf(fp, "%d",&A[3]);   int i;   for(i = 0;i<4;i++)   {     printf("%d\n",A[i]);   } }

marriess
質問者

お礼

回答ありがとうございます。 おかげさまで、fscanfを用いてできました。

その他の回答 (2)

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.3

久しぶりにC言語で書いてみました。 参考にどうぞ。 #include <stdio.h> /* 未使用要素の値は-1とする */ #define UNUSED -1 int main(){ int A[10], i; const char *fname = "aaa.txt"; FILE *fp; /* ファイルfnameを開く */ if((fp=fopen(fname,"r"))==NULL){ perror(NULL); return -1; } /* 配列Aの初期化 */ for(i=0; i<sizeof(A)/sizeof(A[0]); i++) A[i] = UNUSED; /* fpからint要素を取り出して配列Aに入れる */ for(i=0; i<sizeof(A)/sizeof(A[0]); i++) if(fscanf(fp, "%d", &A[i])==EOF) break; /* 配列Aの中身を表示 */ for(i=0; A[i]!=UNUSED; i++) printf("%02d: %d\n", i, A[i]); return 0; }

marriess
質問者

お礼

回答ありがとうございます。おかげさまで出来ました。 細かく書いてくださったプログラムも参考にさせていただきます。

  • gonbee774
  • ベストアンサー率38% (198/511)
回答No.2

補足:テキストファイルのファイル名が「data.dat」でしたが、「aaa.dat」に置き換えて下さい。

関連するQ&A

  • c言語 配列

    関数の中で複数の値を配列で返したいのですが,どうすればいいでしょう? 配列を関数に渡す時にはアドレスが渡されるので,ポインタと同様関数内で値を変えればmain関数の値も変わるのではないかと思ったのですが,上手くいきません. 知りたいのは,main関数の中の配列(できれば2次元配列)の値を他の関数から値を変更する方法です.下のプログラムはためしに書いてみたものです.質問を理解するうえで役立てば幸いです. #include<stdio.h> void func(double aaa[][3] ,double bbb[]); void main(void){ double array_a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; double array_b[3]={0}; func(array_a,array_b); } void func(double aaa[][3] ,double bbb[]) { int i,j; for (i=0;i<3;i++) { for (j=0;j<3;j++) { bbb[i]=bbb[i]+aaa[i][j]; } } }

  • テキストファイルを配列に

    始めまして C言語にてテキストファイルの中身を読み込み一次元配列に代入するというシステムを作ろうとしているのですがわかりません テキストファイルの中身は 12 5312 72 7 444 53 7884 といった具合で100数行あり一行ごとに配列に入れたいです 勉強を始めたばっかりで本を見ても書いていなく困っています わかるかたご指導願えますか? よろしくお願いいたします

  • C言語 宣言した変数になにも代入しなかった場合

    int a;  で整数の変数 a を宣言したとします。 ここで a になにも操作を加えなかったら、aは空っぽのままですよね? a の中身が空っぽかどうかを調べるにはどのようにすればよいのでしょうか? 例えば、整数aの中身を調べて、何か代入されていればそれを表示し、なにもない空っぽであればエラーを表示し終了するプログラムを書こうと思えばどのようにかけばよろしいのでしょうか? main() { int a; ・・・・ if (■■) { printf("Error!\n"); exit(1); } printf("a = %d\n",a); この if の■■に書くべきことを教えてください。

  • C言語で、他の関数で配列を書き換えられないようにしたい

    下のCのプログラムでは、func関数は配列aの先頭要素へのポインタを返します。 main関数の側では配列aの中身を表示します。 しかし、main関数のfor文の中の★の部分をコメントアウトせずに入れると、この配列の中身が書き換わってしまいます。  私はfunc関数以外では、この配列の中身をいじられたくないのです。  なんとかfunc関数を工夫して作成して、func関数以外では、配列の中身が変わらないようにしたいのですが、どうすればよいでしょうか。    とは言ったものの、多分できないだろうなあ、という気がします。  できないならばできないでも仕方ないのですが、確信が持てないのです。 条件があります。 funcでは表示は行なわない。 配列aの中身を表示できるように、funcから呼び出し元へ、aのアドレスまたはaの先頭要素のアドレスがわかるような情報を返す。 #include <stdio.h> char *func(int i) { static char a[]="AAAA"; a[i]='z'; return a; } int main(void) { int i; for(i=0; i<4; i++) { char *p=func(i); /* p[i]='X'; ★配列の中身を書き換えてしまう。 */ puts(p); } return 0; }

  • VB テキストファイルから1文字だけ読み込みたい

    1.txtの中身が 01110 10100 であったとします open "1.txt" for input as #1 でファイルを開いて、 dim readin(10) as integer に対して、 readin(0)=0 readin(1)=1 readin(2)=1 ・・・   =1      =0      =1      =0 readin(7)=1 readin(8)=0 readin(9)=0 というように、整数の配列にテキストの中にある0と1を代入したいのですが、どうすればよいのでしょうか。 検索をしても、line input のように行で読み込むものや、項目の間にスペースの区切りが必要なものが出てきます。 テキストの中身をスペースで区切る、もしくはlineinputでバッファ変数に読み込んだあと、leftなどでバッファから読み込むことも出来そうですが、それは最終の手段としておいておいて、 一回の操作で直接1文字のみ読み込む方法があれば教えてください。

  • C言語の配列とポインタについて

    C言語の配列とポインタについてわからないことがあります。 以下のソース例は、10個の値の平均値を求めるプログラムです。 コメントを挟んだ部分が疑問点です。 【ソース例】 #include <stdio.h> int getaverage(int *data); int main(void) { int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; average = getaverage(array); printf("%d\n",average); return 0; } int getaverage(int *data) { int i,average = 0; for (i = 0;i < 10;i++) { average += data[i]; /*ポインタ変数なのに? */ } return average / 10; } 【実行例】 49 このdata[i]はポインタ変数であり、 配列arrayの i 番目の要素であるarray[i]の"アドレス" が代入されているはずだと思うのですが、 なぜ通常の整数変数であるaverageと数値計算が出来、正しい結果が出たのでしょうか? あたかもdata[i]には、 array[i]の"アドレス"ではなく、 array[i]の"メモリの中身"が代入されているようです。 どういうことでしょうか? 回答よろしくお願いします。

  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • C言語のことで…

    C言語のポインタの勉強をしているのですが、 9×9の整数型2次元配列を格納する関数kuku_makeを作成。 結果確認はmainで上記関数を呼び出して結果を表示。 void kuku_make(int kuku[][9]) 方向性だけでもいいので教えてください。

  • 【c++】文字列の操作

    お世話になります。 テキストの操作について質問があります。 getline関数を使用してテキストの1行分を読み込み その文字列をstrtok関数を使用し区切り文字ごとに配列に入れたいと考えています。 ですがgetlineはstd::string型の変数が必要でstrtok関数はchar型しか受け付けないため 関数同士で型が合わず困っています。 何とか型を合わせる方法は無いでしょうか。 以下にソースコードを記載しますのでご指導お願いします。 int main(){ using namespace std; string strText; char chArray[100]; ifstream fs("test.txt"); //パスで指定されたファイルから1行分の文字列を取得する while( getline(fs , strText , '\n') ){ //区切りごと配列に入れたい chArray = strtok(strText , ","); } }

  • C言語での、テキストファイル読み込みについて

    30行×30列の数字が記載されてテキストファイルがあり、 それをC言語で例えばA[ ][ ]といった配列に読み込みたいのですが、 どうすればよいでしょうか? fscanf関数を用いればできないことはないと思うのですが、 30個も書かなければならないのは冗長なので・・・。 なにかよい方法はありますでしょうか?