• 締切済み

[初心者です]Cでのファイル読み込み

初めまして。質問させていただきます。 プログラミング初心者でコンパイラはgccです。 テキストファイルに書かれた10行の文字列をfgetsを使って読み込みたいので、 以下のようなプログラミングを組みました。 int i=0; char data[256]; char* dataname[256]; char filename[] = "datatext.txt"; FILE* fp = fopen( filename, "r" ); if(!fp)printf("error"); while( fgets(data, 256, fp) != NULL ) { dataname[i]=data; printf("%s",dataname[i]); i++; } fclose(fp); return 0; と、これはうまくいったのですが(初心者ゆえに)本当に上手くいってるのかと思い、 いろいろプログラミングを書き換えて確認していたら、 ・・・・・・・・・(上は同じ)・・・・・・・・・ while( fgets(data, 256, fp) != NULL ) { dataname[i]=data; i++; } fclose(fp); printf("%s",dataname[0]); printf("%s",dataname[1]); printf("%s",dataname[2]); ・・・ printf("%s",dataname[9]); return 0; とprintfの位置を変えると、表示が全て最後の行の値(dataname[9])になってしまいました・・・ これってメモリとかの関係?ですか?原因を知りたいです。 連休中ゆえ質問できる知人もおらず困っています。どうぞよろしくお願いします。

みんなの回答

回答No.3

おそらく、誤解しているような気がするので >dataname[i]=data; は「ファイルからdataに読み込んだ内容をdataneme[i]にコピー」しているわけではありません。 >char* dataname[256]; は「char型のポインタ」を256個用意しているだけです。 ポインタは、「地図の住所」にあたる「変数が存在しているアドレス」を示すだけのものです。 >char data[256]; でdataが「メモリの100番地」に確保されたとすると、 dataname[0]=data; によってdataname[0]に保存されているのは「100番地」という情報です。 data[]の内容をコピーしているわけではありません。 >printf("%s",dataname[i]); は、「dataname[i]に保存されている番地にある内容を表示する」という意味です。 先ほどの地図の例に例えると、「地図の住所に行って実物を見てくる」ということです。 従って、 >とprintfの位置を変えると、表示が全て最後の行の値(dataname[9])になってしまいました・・・ というのは、dataname[0]~[9]は、全てdataの確保された番地が保存されていて、 最後にdataに読み込まれた内容を表示するという「プログラム的には正しい」動作です。 最後にヒントだけ >char* dataname[256]; は char dataname[256][256]; のような形で宣言しなければいけません。

  • foobar
  • ベストアンサー率44% (1423/3185)
回答No.2

dataname[0]からdataname[9]のどれにもdataへのポインタが入ってるので、 結局 printf("%s",data); を10個並べているのと同じことになっているのではないでしょうか。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

とりあえず、回答しようとする側でそのままコンパイルできるよう、 ヘッダーファイルのインクルードやmain関数の定義などを含めて お手持ちのソースコードを省略せずにそのままコピー&ペーストして提示してください。

iammkoto
質問者

補足

回答ありがとうございます! 簡単なプログラムです^^; お願いしますm(_ _)m ////////////////////////////////////// #include <stdio> int main() { int i=0; char data[256]; char* dataname[256]; char filename[] = "filename.txt"; FILE* fp = fopen( filename, "r" ); if(!fp)printf("error"); printf("while内では\n"); while( fgets(data, 256, fp) != NULL ) { dataname[i]=data; printf("%s",dataname[i]); i++; } fclose(fp); printf("\n確認のため表示してみると・・・\n"); printf("%s\n",dataname[0]); printf("%s\n",dataname[1]); printf("%s\n",dataname[2]); printf("%s\n",dataname[3]); printf("%s\n",dataname[4]); printf("%s\n",dataname[5]); return 0; } ////////////////////////////以上です 同一ディレクトリ下に6行の適当なテキストファイル ”filename.txt” を置いてくださいm(_ _)m 以下よければfilename.txtへのコピペに使ってください 1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg

関連するQ&A

専門家に質問してみよう