dポイントプレゼントキャンペーン実施中!

ex.filのファイルの中身は以下の通りです。

0103 美空ひばり 川の流れのように
0209 山口百恵 いい日旅立ち
0992 キャンディーズ 危ない土曜日

このデータを構造体「iti」に読み込ませるために
以下のようにしました。
------------------------
typedef struct itiran_ {
char code[5];
char singer[20];
char melody[50];
} itiran;

itiran iti;

int main(void){

char buf[5];
char buf2[100];




fp = fopen("ex.fil","r");

if(fp == NULL){
exit(1);
}

i = 0;

while(fgets(buf2,sizeof buf2,fp) != NULL)

iti[i].code = strtok(buf2," ");
↑ここでエラー

iti[i].singer = strtok(NULL," ");
iti[i].melody = strtok(NULL,"\n");i++;
}
------------------------

「iti[i].code = strtok(buf2," ");」のところで
「互換でない型変換」というエラーが出てしまいます。

iti[i].codeも
buf2も
どちらもchar型変数なのに
どうしてこのようなエラーになるのかが
分かりません。

ご教示して頂けたら幸いです。

A 回答 (3件)

問題は大きく分けて二つ。


・itiは配列じゃない。
最大数を適当に見込んで配列として宣言するか、
動的確保するなどの対策が必要です。
仮に、最大100件だけ処理するとしましょうか。
itiran iti[100];
・行の分解にstrtok()は効率が悪い。
行の分解部分は、次のようなコードで事が足ります。
if (sscanf(buf2, "%4s %19s %49s", iti[i].code, iti[i].singer, iti[i].melody) != 3) {
// 項目が足りない。必要ならここでエラー処理
}
・念のために、最大数を超えないチェックもしておきましょう。
++i;
if (i == sizeof(iti) / sizeof(*iti)) {
// 100件到達。適当にエラー処理
break;
}
    • good
    • 0

エラーとは直接関係無いかもしれませんが。



strtokの戻り値はポインタです。
itiran.codeは配列として宣言されているので本質的には違う型です。

itiran.code を char* で宣言するか、

char* tmp = strtok(buf2," ");
strncpy(iti[i].code, tmp, strlen(tmp));
iti[i].code[strlen(tmp)] = '\0';

などとした方が良いと思います。

この回答への補足

鋭いご指摘有り難うございました。

>itiran.code を char* で宣言するか、
ということでしたので

typedef struct itiran_ {
char* code;
char* singer;
char* melody;
} itiran;

と、してみました。

上手く行きそうだったのですが
強制終了になってしまいました。

問題はprintfのポインタの参照方法だと思うのですが
どのように参照すればいいのか
ご教示して頂けたら幸いです。

------------------------



iti[i].code = strtok(buf2," ");

iti[i].singer = strtok(NULL," ");
iti[i].melody = strtok(NULL,"\n");

printf("can %s %s",*iti[i].code , *iti[i].singer);

補足日時:2006/09/28 16:57
    • good
    • 0

たぶんですが。



iti[i].code = strtok(buf2," ");
これitiは配列の宣言してませんよね?

とりあえず
iti.code = strtok(buf2," ");
だとエラーが出なくなると思います。
    • good
    • 0
この回答へのお礼

ご返事有り難うございました。

お陰様で
エラーが無くなりました。
単純なミスだったんです。

お礼日時:2006/09/28 17:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!