- ベストアンサー
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
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ファイルの書き込みの際、最後に追加することはできますが、最初に挿入することはできません。 読み込みと書き込みの2つのfp(ex. fpr,fpw)を準備し、fpwには最初に”コントロール・・・”を書き込み、その後、fprから読み込んだ内容を1行ずつ書き込んでください。
その他の回答 (1)
- arain
- ベストアンサー率27% (292/1049)
>既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 であれば、書き出し(fprintf)ではなく、一連の動作として「読み込み」と「追加の処理」を行った後に「書き出し」なんだけど、 その部分のソースはなぜないの?
お礼
「末尾に追加」が出来るなら「先頭に挿入」もできるんじゃないか、 との考えが頭の中の前提にあったため、 一度読み込み、書き出すという発想がありませんでした。 ありがとうございます。
お礼
#define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> int main(void) { FILE *fp, *fp2; char buf[81]; fp = fopen( "test.csv", "r" ); if( fp == NULL ) { puts( "test.csvが開けません" ); return 1; } fp2 = fopen( "test2.csv", "w" ); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); if( fp2 == NULL ) { puts( "test2.csvが開けません" ); return 1; } while( 1 ) { fgets( buf, 81, fp ); if( feof( fp ) ){ break; } fputs( buf, fp2 ); } fclose( fp2 ); fclose( fp ); return 0; } ------------------------------------------------------------ 以上のようにする事で希望の動作ができました。 一度読み込んでから書き込む、という発想がなく、助かりました。 ありがとうございます。