fgetsの小さなピットの行末改行記号c c++phpを覚えます

1598 ワード

以前はOIの問題をするのにgetsをよく使っていましたが、とても便利で、自動的に1行を読み取って、スピードが速いです.ファイル操作を行う場合、当然fgetsとgetsは差が少ないと思い、c/c++標準ライブラリのreferenceをざっと見て使いました.しかし、彼らはまだいくつかの違いがあります.私はファイルからfgetsでKeyを読み取って、このKeyに対応するデータを探していたとき、死活が見つからないことに気づきました.しかし、私がデータをすべて印刷すると、Keyと同じデータが見えます.なぜこのKeyを探しても役に立たないのですか.この穴は私に長い間デバッグさせた.やはり偶然にもこのキーの上にマウスを置いたとき、このキーの最後に「改行符」があることに気づいた.fgetsは改行符を食べていなかったが、前に使っていたgetsは食べていたので、驚いてreferenceをよく見てみると、こんな話があったことに気づいた.
Notice that fgets is quite different from gets: not only fgets accepts a stream argument, but also allows to specify the maximum size of str and includes in the string any ending newline character.
私がよく見ていないせいで、これでNoticeなら無視できます.だから毎回
fgets(read_buffer, MAX_LENG, fp);

あとは、改行を外す必要がありますので、
read_buffer[strlen(read_buffer) - 1] = '\0';

同じように目fputsを見ても改行はつけず、自分でつける必要があります.
あとでPHPを使うときは、意外にもPHPのfgetsもこのように設定されていて、行末改行も読み込まれるので、手動で改行を外す必要があります.$str = substr($str, 0, -1);を使用して改行を切り取ることができます.