• ベストアンサー

1行ずつではなくまとめてファイル出力したいのですが

Oh-Orangeの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

★アドバイス >教材は、c++よりもcなんでしょうか? >c++だと、クラスだのストリームだのMFCだのがいっぱい書かれている割に >こういう事が書かれていない物が多そうなのですが。  ↑  これは一通りC言語を知っている人用に書かれている場合ですね。  私が最初に読んだ C++ の入門書も C 言語を既に知っている前提で解説していましたから。  良く分からないまま C++ を使うよりかは C 言語の基礎から始めた方が良いでしょう。 >なお、最初にfopenして、プログラム終了までfcloseしないものは、 >運用上拙いのかもしれません。  ↑  なぜ?そう思うの? >丸一日丸何日動かすので、度々クローズしてくれると…その時途中までの結果が残せると思うのですが。  ↑  この場合は書き込み中の時に明示的に fflush() 関数を呼んであげれば良い。  これで出力ストリームのバッファをファイルに必ず書き込みます。  これを利用すれば fopen~処理~fclose をずっと行っても途中までの結果を残せます。  http://www.bohyoh.com/CandCPP/C/Library/fflush.html→『fflush』  『fflush』関数はデータを100行出力したらフラッシュするようにすれば良いでしょう。 ・下にサンプルを載せておきます。 サンプル: int main( int argc, char *argv[] ) {  FILE *fp;    if ( (fp = fopen("c:\\kekka.csv","a")) != NULL ){   int array_output[ 3100 ][ 12 ];   int count = 0;      for ( int i2=i-3000+1 ; i2<=i ; i2++ ){    if ( ++count >= 100 ){     fflush( fp );     count = 0;    }    fprintf( fp, "%s,%s,%s,.....\n", array_output[i2][1], array_output[i2][2], array_output[i2][3], … );   }   fclose( fp );  }  return 0; } その他: ・上記のように最初に fopen して計算結果を fprintf で出力して最後に fclose します。  途中でデータを 100 行出力したら明示的に出力バッファをファイルに書き出す指示を  fflush 関数で行っています。1行でデータが長い場合は 10 行単位で fflush したり、  あるいは fprintf の次に必ず fflush を記述します。ただしこの場合は出力処理が  長くなります。よって適度な行数を出力したら fflush を呼ぶようにします。 >クローズしない場合、途中で停止させた場合、どこまで残るんでしょう。  ↑  下の『参考URL』にバッファを大きく取り最後に fflush しています。  ここを読んでみて下さい。ストリーム・バッファの動きが分かります。 ・以上。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/fflush.html
tekcycle
質問者

お礼

フラッシュフラッシュというのが何なのかようやく理解できました。 > if ( ++count >= 100 ){ なるほど、こう書くのですね。if括弧内のどこかにcount++を埋め込んでいました。こりゃ楽ですね。勉強になります。 c++の入門本を読んだのですが、クラスだのポインタだのはよく書かれていたのですが、標準関数に対してほぼノータッチで。(良い本だとは思います) もう一冊の初中級者向けと思われる本にも、C++らしい事は載っていても、標準関数はあるかないか程度で。 本棚に埋もれていた、かなり前に何となく古本で買ってしまったTurboC(懐かしい)の本を見つけ、そこに標準関数が触りくらい載っていて、少し書けました。 もっとも今となっては古い物もあるようで...。 Cで良いそうですので、少々古い物でよいのなら近所の大学の図書館にあるでしょうから、近々行ってみます。 どうもありがとうございました。

関連するQ&A

  • ファイルの3行目までを出力したい

    Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。

    • ベストアンサー
    • Perl
  • CSVの出力(1行を3行に出力~)

    テキスト式1行 200705 00001 A01 A02 B01 B02 C01 C02があるとします。 200705と00001は3行の先頭を出したいので、どうやってループさせたらいいのかわからないのです。 今の状況 Private Sub Object(lFname As String, lOFilename As String) Dim IUO As Variant ''出力データ Dim lFBnt As Long ''開始位置1 Dim m_Input As String ''レコード退避先データ Dim byteInput() As Byte ''領域確保変数 Dim fs As Object ''ファイルシステムオブジェクト Dim ObjOutFile As Object ''出力先ファイルオブジェクト'' IUO = "" ''出力先ファイルオブジェクトの作成 Set fs = CreateObject("Scripting.FileSystemObject") ''出力先ファイル名の指定 Set ObjOutFile = fs.CreateTextFile(lOFilename, True) ReDim byteInput(レコードの長さ- 1) ''正常ファイル時のファイルオープン Open lFname For Binary As #1 '' ファイルの終端までループを繰り返します。 Do While Loc(1) < LOF(1) IUO= "" ''該当行のレコードデータの取得 Get #1, , byteInput m_Input = StrConv(byteInput, vbUnicode) lFBnt = 1 IUO = IUO + Chr(39) & MidMbcs(m_InputBuffer, lFBnt, 一つ目のパラメータ名) + Chr(39) lFBnt = lFBnt + 一つ目のパラメータ名 IUO = IUO + vbNewLine ''改行 ''ファイルへの書込 ObjOutFile.Write (IUO) Me.Refresh Loop Close #1 ''File close ObjOutFile.Close Set ObjOutFile = Nothing End Sub 以上では1行しか出力できないのですが、どうやったら3行出力できるのでしょうか。 よろしくおねがいします。

  • c++ 出力ファイル名

    c++ 初心者 です。fortran 77fortran 90でしたら幾分わかります。 c++ のプログラムで、for 文やwhile文の中に出力させる文章を置いて、出力されるファイル名をforやwhileの変数に関連ずけるには、どういったものを書けばよいでしょうか? たとえば、以下のようなプログラムを書いて実行すると、"test"という文が書かれた"1"というファイル名のファイルが出力されます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { ofstream of; of.open("1", ios::app); of << "test" << endl; of.close(); return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の出力ファイル名は"1"ですが、これをfor文等のループの中で"1"~"10"として10個のファイルを出力したいです。 以下のように書くと、"i"というファイルに"test"という文字が10個書き込まれます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { int i; ofstream of;   for(i=0; i<=10; i++) {     of.open("i", ios::app);     of << "test" << endl;     of.close(); } return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の"i"のクオーテーションマーク""をとって of.open(i, ios::app); のように書いたらエラーでコンパイルできません。また、 of.open((char*) i, ios::app); のように書くとコンパイルはできますが、ファイルができません。 ファイル名"1"に"test" ファイル名"2"に"test" ファイル名"3"に"test" ・ ・ ・ ファイル名"10に"test" という風に出力できればいいのですが... わかる方すみませんが、ご指導願います

  • ofstreamのパラメータについて

    こんにちは。 よろしくお願いいたします。 次の様なソースで、ofstreamで定義した「OutFile」をオープンし、 オープン出来たかどうかを、次のif文で見ています。 ofstreamで定義した「OutFile」は色々なパラメータを含んでいますが、このif文で見ているのは、「OutFile」のどこのパラメータでしょうか? ofstream OutFile; AnsiString asBuff; asBuff = "C:\\aaa.tmp"; OutFile.open( asBuff.c_str() ); if( !OutFile ){ ShowMessage("エラー"); }

  • ファイル出力について

    「test1」というファイルの最後の3行を「test2」というファイルに出力する。 というプラグラムはどのように組み立てればいいのでしょうか? (test1) 1行目の文 2行目の文 3行目の文 4行目の文 5行目の文 6行目の文 ↓ (test2) 4行目の文 5行目の文 6行目の文

  • ファイル出力ついて

    当方、JAVA初心者です。 CSVファイルの出力を行うプログラムを作成しています。 仕様として1行目はヘッダ部分を出力し、 2行目以降にDBの値を出力するCSVファイルを作成しようとしています。 例 (ヘッダ部分)"項目A----","項目B----","項目C----","項目D----" (データ部分)"項目Aの値","項目Bの値","項目Cの値","項目Dの値"             ・             ・ ですが、データ部分の個数が不変になっており、ヘッダ部分がずれてしまいます。 例 項目Cの数が2個ある場合はデータ部分に項目Cの値を2個出力する為、 項目Dのヘッダ部の列の下に項目Cの2個目の値が書き込まれてしまいます。 "項目A----","項目B----","項目C-----","項目D-----" "項目Aの値","項目Bの値","項目Cの値1","項目Cの値2","項目Dの値"             ・             ・ そこで、先にデータ部分の書き込みを行い、それぞれの項目のデータ件数の最大値を保持し、最後にデータ件数の最大値に合わせてヘッダ部分の書き込みを行おうと考えているのですが、 ファイルをopenしなおす方法以外で、 先に2行目以降の書き込みを行い、最後に1行目の書き込みを行う方法がわからなく困っております。 ご回答のほど、宜しくお願いします。

    • ベストアンサー
    • Java
  • <Perl>参照配列の出力に失敗する。

    <Perl>参照配列の出力に失敗する。 お世話になります。 配列の出力部で以下のエラーが出力されます。 Use of uninitialized value in print at test2.pl line 12. -----コーディングは以下の通りです。----- #!C:\perl use strict; use warnings; my @l = (); #----------- #GetDataへCSVファイル名と、格納用配列を渡す #----------- my $cnt = &GetData("test.csv", \@l); print "COUNT -> ".$cnt; for(my $i=0; $i < $cnt; $i++){ print $l[$i]; } ################################################################## # 概   要:指定したCSVファイルをオープンしCSVデータを配列に取得する。 # パラメータ:ファイル名, CSVデータ格納用配列 # 戻 り 値:データ取得件数 ################################################################## sub GetData { my ($f, @bf) = @_; my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @bf = split(/,/, <FP>); close(FP); $rcnt = @bf; print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } -----実行結果は以下の通りです。----- D:\>perl test.pl FILE NAME -> test.csv FILE OPEN -> success. CSV GET COUNT -> 5 Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. COUNT -> 5 -----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)----- あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの 配列の要素数が取れているので、配列内にデータは格納されているとは思っています。 出力方法をどのように正せばよいがご教示お願い致します。

    • ベストアンサー
    • Perl
  • E型の出力について

    お世話になります。 Fortran90にてファイル出力する際、数値データをE型で出力します。 この時、値がゼロに非常に近いデータが「0.1820639214-253」のように出力されてしまいます。 何が問題なのか、教えてください。 ちなみに出力文は以下のような感じです。 open(10,FILE = DATA.dat,form='formatted') write(10,'(10E20.10)')((F(i,j),j=1,Nz),i=1,Nx) close(10)

  • print_rで出力した配列データファイルをfile_get_cont

    print_rで出力した配列データファイルをfile_get_contentsでそのまま取り込もうとしましたが、配列としてではなく文字列として取り込んでしまいます。 ひとつの配列にまとまってしまします。 text.php $data=array(1,2,3,4,5); print_r($data); Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) output.php これを別ファイルで取り込むと$value= file_get_contents("text.php"); echo $value; print_r($value);両方とも Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) が出力されました。 配列として取り込みたいのですが可能でしょうか?

    • ベストアンサー
    • PHP
  • 2つのエクセルから同じデータを持つ行を出力する方法

    エクセルで作成した二つのDBがあります。それぞれ、列・行の数は異なるのですが、同じ名称の列(例えば郵便番号)を持っています。 この二つのファイルから、同じ列に同じ情報をもった行を取りだす、ということをしたいのですが、関数やマクロでの実現できる方法がございましたら、教えて頂けないでしょうか。 例:二つの住所録のようなファイルAとファイルBがあって、郵便番号が154-0001のデータ(行)を、別のファイルCに出力する。(また、ファイルC上では、各データがファイルAとファイルBのどちらから出力されたものかも、判別が付くように出力したい) 分かりにくいケースで大変恐縮ですが、ご存じの方がおりましたら、どうぞよろしくお願いいたします。 ※エクセル2003を使用しています。