• ベストアンサー

ファイルの入出力プログラムについて

こんにちは。 以下のようなプログラムは作れますでしょうか? 名前  住所  生年月日 性別 1 ○○○ △△△ ××× □□□ 2 ○○○ △△△ ××× □□□ 3 ○○○ △△△ ××× □□□ 上記の名前などは、気にしないでください。 プログラムを一回実行したら、1行目に実行結果が書き込みされ、2回目実行しましたら、一行目に書き込みした内容は削除されずに、2行目に記述されるというふうに、これを100回実行し100回分のデータ(100行)を出力させます。 もし、よろしければソースも教えていただけたらと思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

#1補> ファイルが存在するかどうか調べて、存在しない場合は、タイトル行を出力するというようにすればいいと思います。

bird_2005
質問者

お礼

stat()関数を用いて、ファイルが存在するかどうかを調べました。解決しました。ありがとうございました。

その他の回答 (5)

回答No.6

ごめんなさい 追加の場合です。 すでに filename.txtに Num Name Address Birthday Sex 1 Hoge1 Tokyo 1990-1-1 Male 2 Hoge2 Tokyo 1990-10-11 Male 3 Hoge3 Tokyo 1994-12-1 Female があるとして、以下のコードでいけるかと思います ================================================ #include <iostream> #include <fstream> int main() { const char fname[] = "filename.txt"; std::fstream INOUT(fname, ios::app); if(INOUT){ // INOUT << "Num Name Address Birthday Sex" << std::endl; INOUT << "4 Hoge4 Tokyo 1980-11-1 Female" << std::endl; INOUT << "5 Hoge5 Osaka 1970-10-11 Male" << std::endl; INOUT << "6 Hoge6 Sapporo 1964-12-12 Female" << std::endl; } else{ std::cout << "Cannot Open File!!" << std::endl; } INOUT.close(); } =============================================== INOUTの行を追加したい内容に置き換えればよろしいかと思います。 GNU C++ で確認済み

bird_2005
質問者

お礼

サンプルプログラムまで詳しくご提示くださいまして有難うございました。 解決しました。ありがとうございました。

回答No.5

ごめんなさい追加書き込みの場合でしたね。 先ほどのは無視してください

回答No.3

最初の1回目だけに「名前 住所・・」といったタイトル行を出力したいって事ですかね・・? 自分でしたら、最初にfopen("hoge.txt","r")で開き、行数を確認します。 →オープンに成功した場合、現在存在する行数から今回書き込む行数目を確認して、改めてfopen("hoge.txt","a")で開き直して追記する。 →オープンに成功したが中身が空であった場合、初の書き込みであると判断してタイトル行と1行目として内容を書き込む。 →オープンに失敗した場合、初の書き込みである為にタイトル行を出力し、1行目として内容を書き込む。 と処理を分岐させます。 名前の前の行番号が必要無い場合、_stat()やPathFileExists()関数で存在確認をしてしまうかもしれません。

bird_2005
質問者

お礼

解決しました。ありがとうございました。 stat()関数を用いて、ファイルの存在確認を行いました。

回答No.2

環境がかかれていないので何ともいえませんが, C++が使える環境なら以下のようにして出力できます =============Source===================== #include <iostream> #include <fstream> int main() { const char fname[] = "filename.txt"; std::ofstream OUT(fname); if(OUT){ OUT << "Num Name Address Birthday Sex" << std::endl; OUT << "1\tHoge1\tTokyo\t1990-1-1\tMale" << std::endl; OUT << "2\tHoge2\tTokyo\t1990-10-11\tMale" << std::endl; OUT << "3\tHoge3\tTokyo\t1994-12-1\tFemale" << std::endl; } else{ std::cout << "Cannot Open File!!" << std::endl; } OUT.close(); } ========================================= ==================結果=================== Num Name Address Birthday Sex 1 Hoge1 Tokyo 1990-1-1 Male 2 Hoge2 Tokyo 1990-10-11 Male 3 Hoge3 Tokyo 1994-12-1 Female (各項目間にはタブが入る) (\tはタブの意味) コンパイル,実行済みです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

fopenで、書き出すファイルを"a"で追加モードでオープンして書き出すだけでいいような気がします。

bird_2005
質問者

補足

書き込みありがとうございます。 >fopenで、書き出すファイルを"a"で追加モードでオープンして書き出すだけでいいような気がします。 "a+"にすることで、解決しました。 しかし、"a+"を追加しただけでは、プログラムを実行するたびに以下のようになります。 [今、現在の実行結果] 名前  住所  生年月日 性別 ○○○ △△△ ××× □□□ 名前  住所  生年月日 性別 ○○○ △△△ ××× □□□ 名前  住所  生年月日 性別 ○○○ △△△ ××× □□□ [理想表示] 名前  住所  生年月日 性別 ○○○ △△△ ××× □□□ ○○○ △△△ ××× □□□ ○○○ △△△ ××× □□□ 上記の、理想表示にするためには、どのような方法がありますでしょうか? よろしくお願いします。