%[^ \ n] sを使用して空白行を読み取る方法

c scanf
%[^ \ n] sを使用して空白行を読み取る方法

私はプログラムを持っています

fscanf(fp,"%[^\n]s",line);

行の読み取りに使用されます。

whileループを挿入すると、

while(!feof(fp))
    fscanf(fp,"%[^\n]s",line);

上記のコードは最初の行で機能し、残りのコードでは

_
NULLとしての行。 (行= “”)
_

私のファイルには、多くの空白行でさえ多くの行が含まれています。 上記のコードを機能させるにはどうすればよいですか?

  0  0


ベストアンサー

まず、変換指定子は `%[^ \ n]`になります(末尾に `s`はありません)。

第二に、明示的なサイズなしで `%[`変換指定子を使用したくありません。そうしないと、バッファオーバーフローのリスクが発生します。

char line[132];
...
fscanf(fp, "%131[^\n]", line);

第三に、これは入力ストリームに改行を残し、潜在的に次の読み取りをファウリングします。

最後に、_feofをループ条件として使用したくないのです。なぜなら、_after_が過去のEOFを読み取ろうとするまでtrueを返さず、ループが何度も実行されるからです。

率直に言って、より良いオプションは fgets()`を使用することだと思います。指定されたサイズより1つ小さい次の改行までをすべて読み取ります。 IOW、「line」のサイズが20文字で、入力行に80文字(改行を含む)がある場合、「fgets」は19文字を読み取り、「line」に0ターミネータを追加します。 入力行が10文字の場合、入力行全体が `line(改行を含む)に読み込まれます。

`fgets`はEOFまたはエラーでNULLを返すため、ループを次のように構築する必要があります。

while (fgets(line, sizeof line, fp))
{
  // do something with line
}
if (feof(fp))
  // hit end of file
else
  // error on read.

5


私は、\ nがスキャンセット内で許可されていないことを確信しています。 そこにコーディングしようとしているものを述べると便利です。

行全体を読みたい場合は、fgets()ライブラリルーチンを使用することを強くお勧めします。 fgets()を使用すると、最大で読み込む文字数を指定できるため、バッファオーバーフローを回避できます。

1


タイトルとURLをコピーしました