C言語による「テキストファイルの読み書き(fprintf)」について
C言語による「テキストファイルの読み書き(fprintf)」について質問です
ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。
以下のように作りました。
------------------------------------------------------------
#include <stdio.h>
int main(void)
{
FILE *fp;
fp = fopen("test.csv","r+");
fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n");
fclose(fp);
return 0;
}
------------------------------------------------------------
このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。)
001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
~(略)
5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える)
AAA,BBB,CCC,DDD,EEE
002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
~(略)
5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり)
希望する動作としては
コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56
001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
~(略)
5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
のようになるようにしたいのですがどのようにすればよいのでしょうか。
よろしくお願いします。
(使用ソフト:Borland C++ Compiler, Cpad)
参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html
お礼
ご回答ありがとうございます。 1回のSQLで取得することができたらPGのソースを9割再利用できるというメリットがあるため できるだけSQLにて1回でできたらと思っております。 もしどうしても不可能な場合はPG側にて処理をさせようと思います。 一応オラクルにて1回のSQLで取得することができました。 --元テーブル CREATE TABLE T_TEST_4 ( KEY VARCHAR2(8), NAME VARCHAR2(255) ) --元テーブルのデータ KEY NAME ------------------------------ 1 AA,AAA,BBB,BBBB,ZZZZZ 2 CCC,DDD,EE,FFFF --SQL /* SplitSQL */ select col1, col2 from( select col1, col2, row_number() over (partition by col1 order by col2 desc) rnk from( select substr( name, case rn when 1 then 1 else instr(name, delm, 1, rn - 1) + 1 end ,case rn when 1 then case instr(name, delm, 1, rn) when 0 then length(name) else instr(name, delm,1,rn)-1 end when nvl(length(translate(name, delm || name, delm)), 0) + 1 then length(name) else instr(name,delm,1,rn)-1-instr(name,delm,1,rn-1) end ) col1, key col2 from T_TEST_4, (select ',' delm from dual) b, (select rownum rn from all_catalog) c where rn <= nvl(length(translate(name,delm || name, delm)),0) + 1 ) ) where rnk = 1 order by col1; --SQL実行結果 COL1 COL2 ------------- AA 1 AAA 1 BBB 1 BBBB 1 CCC 2 DDD 2 EE 2 FFFF 2 ZZZZZ 1