ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、
できたファイルの後に?マークがついてきます。
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?
というファイルができてしまいます。
ファイルの中はしっかりできています。
なにか解決法を知っている方がおりましたら、どうか教えて下さい。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.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 * 型の変数として使われてるので。
sprintfを使うと、簡単にできました。
fgetsのことをよく理解せず、 とても面倒なことをしてしまいました。
お忙しい中、適切な解答をして頂き、本当にありがとうございました。
No.1
- 回答日時:
"0.dat"を例に挙げます。
fprintf()で書き込んだとき、
その行は
'0', '.', 'd', 'a', 't', '\n'
となってますね。
それをfgets()で読むと、fp(ファイルポインタを示すときに使う、よくある変数名と
紛らわしい感じがしますが)の中身は
'0', '.', 'd', 'a', 't', '\n', '\0'
となります。
この'\n'が、ファイル名の一部として残ってしまってるんじゃないでしょうか。
'\n'を'\0'に変えてあげれば、「0.dat」という、
ご希望どおりのファイル名ができあがると思います。
なお、
>解決法を知っている方がおりましたら
おりましたら、というのは、自分の行為に対する謙譲語です。
ここは一つ、「いらっしゃいましたら」と、尊敬語で書いてほしいところですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
ファイルサイズ指定し、ファイ...
-
winsock recvでの文字化け
-
【VB.Net】バイト型配列に読み...
-
fgetsで2行目から文字化け
-
バイナリファイルをテキストフ...
-
VBSで指定行に挿入
-
c言語 2つのファイルを行ご...
-
EOF判定されない
-
fopenで開いたファイルのサイズ...
-
0x00をファイル出力
-
freadでファイルを読み込んだ際...
-
ファイルサイズを変更したい
-
テキストファイルの行数を取得...
-
C言語初心者の質問失礼します。
-
フルパスから最後のディレクト...
-
バッファとは何ですか
-
コマンド(例えばls)の出力結果...
-
VC++から引数付きexeファイルの...
-
どんなプログラムを書いても指...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
テキストファイルの行数を取得...
-
c言語 2つのファイルを行ご...
-
C言語での改行コードの扱いにつ...
-
VBSで指定行に挿入
-
改行までの一文字ずつのファイ...
-
【VB.Net】バイト型配列に読み...
-
freadとfwrite
-
巨大なテキストファイル(可変...
-
0バイトファイルの作成
-
fopenで開いたファイルのサイズ...
-
fopen(書き込みモード)でファイ...
-
winsock recvでの文字化け
-
ファイルサイズ指定し、ファイ...
-
fortranで文字列を読み込む際の...
-
【C言語】テキスト読み込みの行...
-
C言語での採番について
-
VS2010 MFC CStdioFileについて
おすすめ情報