• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語において、以下の条件で、ファイルに保存されているテキストデータを)

C言語でファイルに保存されているテキストデータを構造体に格納する方法を教えてください

このQ&Aのポイント
  • C言語でファイルに保存されているテキストデータを構造体に格納する方法を教えてください。
  • 初心者のため、記述内容が十分かわかりません。具体的なプログラム例を教えてください。
  • 作成したプログラムでエラーが発生してしまいます。コンパイルエラーと実行エラーの原因を教えてください。

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

  • ベストアンサー
回答No.3

 gccでは、エラーが連発して、実行させる以前の問題でした。  ファイルは行末の「 , 」を省いて csv ファイル風に処理してあります。 /* Gcc on Mac OSX */ #include <stdio.h> #include <string.h> /* strtok() */ #include <stdlib.h> /* atoi() */ #define SIZE 256 /***構造体定義***/ struct Person { int num; /*社員番号*/ char name[10]; /*名前*/ char kana[20]; /*名前(ヨミガナ)*/ }; int main(void) { /***変数の定義***/ struct Person List[100]; FILE *rfp; char rbuf[SIZE]; int i = 0; /***ファイルオープン***/ rfp = fopen("memberlist.txt","r"); /*エラー処理省略(ファイルオープンは正常に終了したものとします)*/ /***構造体への格納処理***/ while(fgets(rbuf,SIZE,rfp) != NULL) { /*テキストデータを一行取得*/ List[i].num = atoi(strtok(rbuf,",")); /*文字列を数値に変換し、社員番号を構造体へ*/ strcpy(List[i].name,strtok(NULL,",")); /*名前を構造体へ*/ strcpy(List[i++].kana,strtok(NULL,"?n")); /*ヨミガナを構造体へ、i++を追加*/ } return 0; }

その他の回答 (3)

回答No.4

>>「パラメータ '__buffer' は signed char * 型として定義されているので int は渡せない(関数 main )」 これについては他の方が指摘している通り atoi() を使うことで間違いないのですが、 >>「問題が発生したため、”プログラム名”を終了します。~~~」 これについてはまだ誰も指摘していないのでそれについて解答させていただきます このエラーが発生する箇所はおそらく >>tp = strtok(NULL,","); という部分です。 なぜこのようなエラーが発生するかというと >>char *tp; とポインタだけ宣言しといてアドレスを代入していないため、出たら目なシステムなどが使っている大事なところに代入され Windows OS がその本来のデータを守るためです。 もしポインタを使うのであれば tp = (char*)calloc(256, sizeof(char)); という風にする必要があります。 (これを変数の動的確保といいます)calloc() は第二引数のサイズを第一引数の個数だけ確保したメモリのアドレスを戻り値として返します。 又は、 >>char rbuf[256]; といった具合に配列で宣言するついでに tp も同様に宣言すればよいのではないでしょうか?(こちらを変数の静的確保といいます) このミスはポインタを理解し切れていない人だと良くやらかすものです(私も良くやらかしました)。ポインタという概念はC言語では非常に重要な概念ですのでまだ理解し切れていないのであれば嫌にならない程度に勉強してください。

参考URL:
http://homepage2.nifty.com/c_lang/index_c.html
  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.2

>sprintf(List[i].num,"%05d",tp); /*文字列を数値に変換し、社員番号を構造体へ*/ これはsprintfの使い方が間違っている。 sprintf()はあくまでも文字列に成形する関数です。 List[i].num=strtol(tp,NULL,10); とかにするとよいかも。 あとは、構造体のメンバーが固定長になっているので、バッファーオバーフローのチェックをしないと長い名前の人がいたらプログラムがクラッシュします。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

sprintfの使い方いろいろおかしいような: ・第1引数にint型変数の値を渡している。 ・tpは文字列へのポインタなのに、それを%d(数値用書式文字列)で整形しようとしている。 sprintfのマニュアルを読んでみては。

関連するQ&A