- ベストアンサー
改行コード
いつもお世話になります。 あるバッファからsprintf()でバッファに格納したデータを ファイルにfprintf()で書き込むと、改行コードが混入します。 char b[5][128]; for( int p=0; p<i;p++ ){ sprintf(b[p]"TEST_CODE,%s,NAME\n", data[p]); fprintf(fp, "%s", b[p]); } ファイルには、 TEST_CODE,123 ,NAME TEST_CODE,456 ,NAME と%sの後に改行コードが入ります。 TEST_CODE,123,NAME TEST_CODE,456,NAME のようにしたいです。 何か方法はありますでしょうか? 環境がLinux環境のため、sedコマンドで行う方法も 考えましたが、コマンド自体イマイチわかりません。 関数またはコマンドでの方法がありましたら よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
改行('\n')が一つ入っているのをとりたいのなら、 for 文の中で取り除けばいいのではないですか? data[p]中の改行はそのまま残しておきたいなら あとでまた書き換えればいいですし。。 ==== for (int p = 0; ...) { char *q = strchr(data[p], '\n'); if (q != NULL) *q = '\0'; sprintf(b[p], "TEST...", data[p]); fprintf(fp, ...) if (q != NULL) *q = '\n'; } ==== ・sprintf(b[p] の次にコンマが入ってないのは何故? ・配列 b に値を設定する必要があるのですよね?そうでなければ、 sprintf しないで直接 fprintf で出力するのがいいですね。
その他の回答 (4)
data[]配列の文字列の一番後ろにのみ 改行コードが入っているのでしたら、 for( p=0; p<i;p++ ){ if(data[p][strlen(data[p])-1]=='\n'){ data[p][strlen(data[p])-1]='\0'; } sprintf(b[p],"TEST_CODE,%s,NAME\n", data[p]); fput(b[p],fp); } てな具合でどうでしょう。 windowsですが試したところ いちよ、コレで動きました。 すみません。 ファイル保存のところ勝手に [fprintf();]を[fput();]にかえちゃいました。 やってることは一緒ですので。。。
- tig33
- ベストアンサー率50% (6/12)
data[]配列に改行コードが入っているからですね。 char b[5][128]; char wbuf[32]; char *cp; int ct; for( int p=0; p<i;p++ ){ cp = data[p]; for(ct=0; (ct<strlen(data[p]) && ct < 127); ct++, cp++) { if( ('0' <= *cp) && (*cp <= '9') ) { wbuf[ct]=*cp; } } wbuf[ct]='\0'; sprintf(b[p],"TEST_CODE,%s,NAME\n", wbuf); fprintf(fp, "%s", b[p]); } こんなんでいかがでしょう。
お礼
ありがとうございます。 無事できました。
- mikaemi
- ベストアンサー率50% (33/65)
あと、sedコマンドで改行を取り除きたいなら、たとえば、 Linux なんかで /usr/bin に sed が入っているとして、 ===== #!/usr/bin/sed -f /^TEST_CODE/{ N s/\n// } ====== という sed スクリプトでできますが、Cプログラムの中で やってしまうのがいいのではないですか? それと、行をまたがる置換などは、sed よりも perl なんかの ほうがやりやすいと思いますよ。
- sinkan
- ベストアンサー率0% (0/2)
それはdata[]の末尾に改行が入っているのですよね。 strtok()などでdata[p]の改行コードを落としてみてはいかがでしょうか。
お礼
ありがとうございます。 無事できました。