C言語において、以下の条件で、ファイルに保存されているテキストデータを
C言語において、以下の条件で、ファイルに保存されているテキストデータを構造体に格納する方法を教えて下さい。
例題として、テキストファイルに保存されている社員データを構造体に格納するものとします。
初心者なので、記述内容が充分か分かりませんが、宜しくお願いします。
---以下条件---
・入力ファイルはテキスト形式(.txt)とし、ファイル名は「memberlist」とします。
・ファイル(memberlist)には、社員1人につき、社員番号、名前、名前(ヨミガナ)が、「,」で区切られて存在するものとします。
また、、テキストファイルには一行につき社員1人のデータが存在するものとし、複数の社員データが同一行に存在することはありません。
テキストファイルの例).
10001,山田太郎,ヤマダタロウ,
10002,佐藤一郎,サトウイチロウ,
30010,池田悟,イケダサトル,
………………
………………(続く)
・構造体は以下のように定義されているものとします。
なお、テキストファイルに何件の社員データがあるかは定義しませんが、
構造体の数は充分に確保されているものとします。
struct Person {
int num; /*社員番号*/
char name[10]; /*名前*/
char kana[20]; /*名前(ヨミガナ)*/
};
struct Person List[100];
上記の条件のもとでテキストファイルの内容を構造体に格納したいのです。
そこで以下のようなプログラムを作ってみましたが、エラーが発生してしまいます(後述)。
#include<stdio.h>
/***構造体定義***/
struct Person {
int num; /*社員番号*/
char name[10]; /*名前*/
char kana[20]; /*名前(ヨミガナ)*/
};
struct Person List[100];
main()
/***変数の定義***/
FILE *rfp
char rbuf[256];
char *tp;
int i,size;
/***ファイルオープン***/
rfp = fopen("memberlist.txt","r");
/*エラー処理省略(ファイルオープンは正常に終了したものとします)*/
/***構造体への格納処理***/
while(1){
size = fgets(rbuf,256,rfp); /*テキストデータを一行取得*/
tp = strtok(rbuf,","); /*テキストデータをカンマで区切る*/
sprintf(List[i].num,"%05d",tp); /*文字列を数値に変換し、社員番号を構造体へ*/
tp = strtok(NULL,","); /*テキストデータをカンマで区切る*/
strcpy(List[i].name,tp); /*名前を構造体へ*/
tp = strtok(NULL,","); /*テキストデータをカンマで区切る*/
strcpy(List[i].kana,tp); /*ヨミガナを構造体へ*/
if(size == NULL){
break; /*データを読み終えたら、ループを離脱*/
}
}
上記のプログラムのエラー内容ですが、
まず、社員番号を文字列変換し格納するsprintf文で、
「パラメータ '__buffer' は signed char * 型として定義されているので int は渡せない(関数 main )」
というコンパイルエラーが発生します。
また、実行すると、Windowsからのエラー、「問題が発生したため、”プログラム名”を終了します。~~~」というプログラムが強制終了される時に出現するエラーが発生します。
可能性としてどのような問題が考えられますか?よろしくお願いします。
お礼
ご解答ありがとうございます。 上記の通りやってみたのですが、あまりうまく動いてくれません 具体的に何がしたいかを申しますと、 C++で組んだゲームにランキング情報を載せたく、 カテゴリID(int型)\tスコア(int型)\tユーザー名(short配列・base64エンコード済み)\n カテゴリID(int型)\tスコア(int型)\tユーザー名(short配列・base64エンコード済み)\n カテゴリID(int型)\tスコア(int型)\tユーザー名(short配列・base64エンコード済み)\n ・・・・ ・・・・ ・・・・ というデータを出力するaspファイルがあり(\t はタブ)、 そのデータをPHPで個別に取得し、出力できるよう抽出したいということです。 現状試しているPHPのコードですが、 <?php // 文字配列 $moji = array( "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z" ); // aspファイルからデータを抽出 $openfile = file_get_contents( "aspファイルのパス"); $csv_gyo = split("\n", $openfile ); foreach( $csv_gyo as $kurikaeshi ) { $data = split( "\t", $kurikaeshi ); print "カテゴリID = ".$data[ 0 ]."<br>"; print "スコア = ".$data[ 1 ]."<br>"; print "ユーザー名 = "; // デコード $userdata = base64_decode( $data[ 2 ] ); // short型で配列化 $data_array = unpack("s*",$userdata ); $arrayMax = count( $data_array ); for( $i = 0 ; $i < $arrayMax ; $i++ ){ print $moji[ $data_array[ $i ] ]; } print "<br>"; } ?> このような感じです。 何かアドバイスなどありますでしょうか。 尚、C++のソース、aspファイルの中身は変えられませんので、 PHPのみの変更でお願いいたします。