プロが教える店舗&オフィスのセキュリティ対策術

ファイルの内容をstrcpyを使ってコピーしたら表示がおかしくなりました。
何故か改行が自動的に入るのです。

---ソースの内容---
#include <stdio.h>
#include <string.h>

void main(void){

FILE*fp;
char buf[100];
char set[100];

fp = fopen("fail.txt", "r+");

while( fgets( set, 100, fp ) != NULL ){
strcpy(buf,set);
printf("%s\n", buf);
}

fclose(fp);
}
---ソースの内容ここまで---

---ファイルの内容---
One dey.

He sey this is pen.
But,it is chear.
why?

Oh!No!
---ファイルの内容ここまで---

---出力された内容---
One dey.



He sey this is pen.

But,it is chear.

why?



Oh!No!


---出力された内容 ここまで---


出力された内容をファイルの内容と同じにするにはどう書けばいいのでしょうか?

A 回答 (3件)

#1さんの仰る通り、strcpyではなくfgetsの仕様です。


fgetsは改行まで読み込みますので。

http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=m …
「改行文字があるなら、保持されます。」

逆に、改行文字がない場合は改行が入らないのでprintfで勝手に\nをつけるとbufの大きさ以下の長さの行があった時、変なことになります。

while( fgets( set, 100, fp ) != NULL ){
strcpy(buf,set);
printf("%s", buf);
}

のようにprintfで\n(改行)をつけないで書くと良いでしょう。

あと、別の処理をするために一時的にコピーがほしいならstrdupを使うという手もありますね。

この回答への補足

なるほどいろいろ注意点があるのですね
参考になりました。

while( fgets( set, 100, fp ) != NULL ){
strcpy(buf,set);
printf("%s", buf);
}

で簡単に修正できましたありがとうございました

補足日時:2012/09/29 11:21
    • good
    • 0

既に回答されているようにfgets()で読み込んだバッファから改行コードを取り除くか


>printf("%s\n", buf);
で改行させないか…のどちらかでしょう。

1行が100バイトを越えている場合にどうなるか…というのはありますが。

この回答への補足

多めにバイトを取ることによって回避したいと思います。
ありがとうございました

補足日時:2012/09/29 11:23
    • good
    • 0

>while( fgets( set, 100, fp ) != NULL ){


>strcpy(buf,set);

fgets関数を使って読み取ったsetの最後に改行コードが入っているからです。
fgets関数の仕様です。
setの最後の改行を取り除くには、例えば下記のようなコードを書きます。

set[strlen(set) - 1] = '\0';

こうしておいてからstrcpyすれば、たぶん大丈夫です。

この回答への補足

教えていただいた
set[strlen(set) - 1] = '\0';

ですが最後の一文字が表示されなくなるバグがありました

fgetsが自動的に改行されるとの事なので
printf("%s",set);

とすることで改行を取り除けましたありがとうございました

補足日時:2012/09/29 11:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!