電子書籍の厳選無料作品が豊富!

ファイル操作がよくわかりません。

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:」などの部分はどのようにファイルへ書き込めばいいのでしょうか。
ファイル操作が全くわかっていない状況です。
参考サイトなど ありましたら教えてください。
よろしくお願いします。

A 回答 (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 とします。もし、エクセルをお使いであれば、このファイル名をダブルクリックすると、エクセルで開けるかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/22 20:37

> 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番目から」とのことなので、前のデータのゴミが残っているとか、そういう話なのかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/22 15:31

fwrite((struct music *)list,sizeof(struct list),100,fp);


->
fwrite((struct music *)list,sizeof(struct list)*100,1,fp);
ではないかと。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>fwrite((struct music *)list,sizeof(struct list)*100,1,fp);

というのはlist 100個分のサイズということでしょうか。

お礼日時:2005/07/22 15:29

第一印象からすると、



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);
}
と別々に書き込む必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>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

と改行が入ってしまうのですが、何故でしょうか。

お礼日時:2005/07/22 11:30

こんにちは。



普通に fprintf() を使って1レコードずつ出力するのはダメですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/22 11:20

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