みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2005-07-22 10:13:41

QNo.1530206

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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 とします。もし、エクセルをお使いであれば、このファイル名をダブルクリックすると、エクセルで開けるかもしれません。

投稿日時 - 2005-07-22 17:24:07

お礼

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

投稿日時 - 2005-07-22 20:37:04

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

投稿日時 - 2005-07-22 13:11:15

お礼

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

投稿日時 - 2005-07-22 15:31:57

ANo.3

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

投稿日時 - 2005-07-22 12:17:35

お礼

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

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

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

投稿日時 - 2005-07-22 15:29:23

ANo.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);
}
と別々に書き込む必要があります。

投稿日時 - 2005-07-22 10:53:04

お礼

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

>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:46

ANo.1

こんにちは。

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

投稿日時 - 2005-07-22 10:50:23

お礼

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

投稿日時 - 2005-07-22 11:20:10

あなたにオススメの質問