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

締切り済みの質問

C言語でファイルを出力

ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、
できたファイルの後に?マークがついてきます。

file = fopen("filename.txt", "w");
for(j=0; j<30; j++){
fprintf(file ,"%d.dat\n",j );
}
fclose(file);
file2 = fopen("filename.txt", "r");

として、ファイル名を書いたファイルをつくってから、

for(k=0; k<30; k++){
fgets(fp,sizeof(fp),file2);
file_out = fopen(fp,"w");
省略
fprintf(file_out, %e %e \n",a ,b);
fclose(file_out);
}
fclose(file2);

をして、30個のファイルを出力すると、
0.dat?
1.dat?
2.dat?
.
.
.
29.dat?
というファイルができてしまいます。
ファイルの中はしっかりできています。

なにか解決法を知っている方がおりましたら、どうか教えて下さい。

投稿日時 - 2010-12-19 07:09:51

QNo.6393748

困ってます

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

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

回答(2)

ANo.2

> fgets(fp,sizeof(fp),file2);

fgetsは改行文字まで含めて1行読み出す関数です。
環境が書いてないので、どんな方法でファイル名を確認したかわかりませんが、改行文字はそのままでは「表示」できない(改行されてしまう)ので代わりに「?」を表示しているのだと思われます。

fgetsのあとで、fp[X]=='\n' となっているXを探して fp[X] = '\0' にして改行文字を削除する、というのが、現在の仕様のままでの対処法になります。

が、ファイル名一覧をファイルとして残す必要が無いなら、一覧ファイルに関する命令を削除して

for(k=0; k<30; k++){
sprintf(fp ,"%d.dat",k );
...
と、fpに直接、改行無しのファイル名を入れてしまうのがいいのでは。

また、ファイルの残すにしても「filename.txtを読み込む」という仕様でなければ、下記のように fpにファイル名(改行無し)を入れる→fpを(改行付きで)filename.txtへ出力 とすればいいです。
file = fopen("filename.txt", "w");
for(k=0; k<30; k++){
sprintf(fp ,"%d.dat",k );
fprintf(file ,"%s\n",fp );
file_out = fopen(fp,"w");
省略
fprintf(file_out, %e %e \n",a ,b);
fclose(file_out);
}
fclose(file);

余談ですが、ファイル名を入れる変数に fp って名前を使われると、すごい違和感を感じます。
言語規則としては正しいのですが、慣習的に fp は FILE * 型の変数として使われてるので。

投稿日時 - 2010-12-19 07:55:47

お礼

sprintfを使うと、簡単にできました。
fgetsのことをよく理解せず、 とても面倒なことをしてしまいました。
お忙しい中、適切な解答をして頂き、本当にありがとうございました。

投稿日時 - 2010-12-19 21:02:44

ANo.1

"0.dat"を例に挙げます。

fprintf()で書き込んだとき、
その行は
'0', '.', 'd', 'a', 't', '\n'
となってますね。

それをfgets()で読むと、fp(ファイルポインタを示すときに使う、よくある変数名と
紛らわしい感じがしますが)の中身は
'0', '.', 'd', 'a', 't', '\n', '\0'
となります。
この'\n'が、ファイル名の一部として残ってしまってるんじゃないでしょうか。
'\n'を'\0'に変えてあげれば、「0.dat」という、
ご希望どおりのファイル名ができあがると思います。


なお、

>解決法を知っている方がおりましたら

おりましたら、というのは、自分の行為に対する謙譲語です。
ここは一つ、「いらっしゃいましたら」と、尊敬語で書いてほしいところですね。

投稿日時 - 2010-12-19 07:27:27

あなたにオススメの質問