• 締切済み

C言語:ファイル操作

ファイル操作がよくわかりません。 struct music{ char *artist[256]; char *title[256]; int year; }list[100]; という構造体に格納されたデータをファイルに書き込みたいのですが、 fwrite((struct music *)list,sizeof(struct list),100,fp); とするとyearが表示されません。 また、ファイルへの出力形式は Artist: list[0].artist Title: list[0].title Year: list[0].year のようにしたいのですが「Artist:」などの部分はどのようにファイルへ書き込めばいいのでしょうか。 ファイル操作が全くわかっていない状況です。 参考サイトなど ありましたら教えてください。 よろしくお願いします。

みんなの回答

回答No.5

#1です。 >Artist: list[0].artist >Title: list[0].title >Year: list[0].year ↑の書式にこだわりますか? 私だったら↓のようにします。 int i; fputs("Artist, Title, Year\n", fp); /* 項目名 */ for(i = 0; i < 100; i++) { fprintf(fp, "\"%s\", \"%s\", %d\n", list[i].artist, list[i].title, list[i].year); /* 各データを1行で出力 */ } こうやって出力するファイル名の拡張子を .CSV とします。もし、エクセルをお使いであれば、このファイル名をダブルクリックすると、エクセルで開けるかもしれません。

minato1985
質問者

お礼

実は宿題の一部分でして、出力形式、出力するファイルの種類、共に指定されています。 アドバイスありがとうございます。

回答No.4

> fprintf(fp, "Artist: %s\n Title: %s\n Year: %d\n\n", list[i].artist, list[i].title, year); > として保存されたファイル(txt)をみると2番目から > Artist: > list[i].artist とのことですが、考えられるのは、データの先頭に本当に改行が入っているということです。 このあたりは、データの入力方法がわからないと、何とも言えません。 特に、「2番目から」とのことなので、前のデータのゴミが残っているとか、そういう話なのかもしれません。

minato1985
質問者

お礼

ありがとうございます。 データはscanfで構造体へ格納してます。 これが原因でしょうか。

noname#16581
noname#16581
回答No.3

fwrite((struct music *)list,sizeof(struct list),100,fp); -> fwrite((struct music *)list,sizeof(struct list)*100,1,fp); ではないかと。

minato1985
質問者

お礼

回答ありがとうございます。 >fwrite((struct music *)list,sizeof(struct list)*100,1,fp); というのはlist 100個分のサイズということでしょうか。

noname#11843
noname#11843
回答No.2

第一印象からすると、 struct music{ char artist[256]; char title[256]; int year; }list[100]; で、 fwrite(list,sizeof(list[0]),100,fp); が正解だと思われます。 char *artist[256]; だと、アーティスト名を 256 人分保存出来ますよ。 char artist[256]; は、最大 256 文字のアーティスト名ひとり分です。 sizeof(struct list) は、エラーになりませでしたか?(チェックしていません) sizeof(struct music) か、sizeof(list[0]) かいずれかのはずですが。 あわせて、aritist や title への代入の仕方もおそらく間違っています。 (いや、文法的には間違っていないかも) > とするとyearが表示されません。 とのことなので、保存されたファイルをエディタなどで読みたいというところでしょうか? もしも、そういうことであれば、 int i; for(i = 0; i < 100; i++) { fprintf(fp, "Artist: %s\n Title: %s\n Year: %d\n\n", list[i].artist, list[i].title, year); } と別々に書き込む必要があります。

minato1985
質問者

お礼

回答ありがとうございます。 >char *artist[256]; だと、アーティスト名を 256 人分保存出来ますよ。 char artist[256]; は、最大 256 文字のアーティスト名ひとり分です ポインタもイマイチわかってないです。 例のとおりにかいてみただけです……… >sizeof(struct list) は、エラーになりませでしたか?(チェックしていません) sizeof(struct music) か、sizeof(list[0]) かいずれかのはずですが。 間違えました、エラー出ますね(汗 >保存されたファイルをエディタなどで読みたいというところでしょうか? はい、そうです。 fprintf(fp, "Artist: %s\n Title: %s\n Year: %d\n\n", list[i].artist, list[i].title, year); として保存されたファイル(txt)をみると2番目から Artist: list[i].artist と改行が入ってしまうのですが、何故でしょうか。

回答No.1

こんにちは。 普通に fprintf() を使って1レコードずつ出力するのはダメですか?

minato1985
質問者

お礼

回答ありがとうございます。 fprintfで書き込もうとしましたが、「Artist:」などをどこにかけばいいのかわかりませんでした。