- 締切済み
C言語での縦方向のファイル出力について教えてください。
数万のデータをテキストファイルに出力していく時に、縦方向に並べていく方法を教えて下さい。 j = 1; for(i = 1 ; i < 10 ; i++){ while( j <= 10000){ ..................... .................... j += 1; } i = 1の時、While 文が一回実行される毎に"11" or "22" or "33" が順にテキストファイルに出力されるとした場合、改行コードをつけると、 11 22 33 ・ ・ ・ 改行コードをつけなければ、 11 22 33 ・・・ですが、複数セットの繰り返し(※iの値の増加)をして、順に出力する事は簡単な事なのですが、(以下のような通常の出力) (i = 1) 11 22 33 ・・・・・・ (i = 2) 11 22 33 ・・・・・・ (i = 3) 11 22 33 ・・・・・・ ・ ・ ・ 今回 (i = 1)(i = 2)(i = 3)(i = 4)・・・・・・ 11 11 11 11 ・・・・・・ 22 22 22 22 ・・・・・・ 33 33 33 33 ・・・・・・ ・ ・ ・ ・ ・・・・・・ ・ ・ ・ ・ ・・・・・・ というように、出力させるにはどのように考えたら良いでしょうか? 2次元配列は考えたのですが、扱うデータ数を今後 i の値を100以上、jの値を数万~数十万までする予定なので、配列として領域を確保しないように出来れば・・と考えています。 その他の考えとして、i =1 の時のデータを全て初めに fprintf(fp,"%s \n",s); として改行で出力しておいて、i=2から一行目の一文字ずつ検索して行き、タブもしくは、改行コードを見つけたら、その前にi =2 のときのデータを挿入していくというように考えたのですが、コードとしてどのように記述したらよいか分からなくなっています。 以上のようにしか考えられなくなっています、なにか良いアドバイスや、良い方法を教えて頂けませんか? どうか宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Oh-Orange
- ベストアンサー率63% (854/1345)
★入力用、出力用の2つで処理するのは? ・1つのファイルで読み書き両用でオープンして処理するのは大変なので 入力用と出力用の2つのファイルを読み込み用、書き込み用として使います。 ・処理は行単位で取得して末尾に追加したいものを書き出します。 このとき fgets() ではなく fgetc() で改行文字が現れるまで入力して それをそのまま fputc() で出力へ流します。そして改行文字が見つかったら 新しい文字列を出力へ追加して改行文字も出力します。 これを行単位で繰り返します。 ・挿入する方法はデータの移動が大変ですのでこの方法が楽です。 入力用、出力用の2つで処理する方法をお勧めします。 ・下にそのサンプルを載せておきます。 サンプル: FILE *fp; ←読み込み用 FILE *fo; ←書き込み用 int ch, moji; // 読み書き処理 if ( (fp = fopen("読み込み名","r")) != NULL ){ if ( (fo = fopen("書き込み名","w")) != NULL ){ for ( ; ; ){ ←無限ループ // 既存の文字列を入力→出力へ while ( (ch = fgetc(fp)) != EOF ){ if ( ch == '\n' ){ break; } if ( isdigit(ch) ){ moji = ch; } fputc( ch, fo ); } if ( ch == EOF ){ ←EOF ならここで抜ける break; } // 追加文字列を出力へ fputc( moji, fo ); fputc( moji, fo ); fputc( '\n', fo ); } fclose( fo ); } fclose( fp ); } // ここで削除&リネーム remove( "読み込みファイル名" ); rename( "書き込みファイル名", "読み込みファイル名" ); その他: ・上記のサンプルでは必ず読み込みファイルに1列目のデータがあるという前提です。 よって最初の1列目データは普通にファイルに出力して下さい。ここ要注意。 ・あと書き込み用ファイルを次の読み込み用ファイルとするにはファイル名をリネーム するか、上記の『fclose( fo );』の上に書き込み用のファイルを読み込み用ファイルに 上書き(コピー)する処理を追加します。 ・速度面からリネームがお勧めです。 リネームは2つのファイルをクローズしてから削除(remove)して、リネーム(rename)と 順番に行います。 ・以上。
お礼
昨日はどうもありがとうごさいました。Oh-Orangeさんのアドバイス 通りに行なって、動きました。