2

1 行を読み取ろうとしていますが、改行文字がどのように表現されているかわかりません。fgets() でファイルから読み取る場合、2文字または1文字と見なす必要がありますか? たとえば、ファイルに 15 文字の行 + 新しい行があります。では、文字列を安全に割り当ててその行を読み取るにはどうすればよいでしょうか?

最初に、私はこれを試しました:

char buf[16];
fgets(buf, 16, f);

改行文字なしで行を正しく読み取り、buf[15] がヌル文字を保持していると仮定します。

しかし、改行文字を読み込んで保存したい時、思うように動きません。私が知る限り、'\n' は 1 文字と見なされ、1 バイトしか必要ないため、それを読み取るには、もう 1 文字読み取る必要があります。

しかし、私はこれを試してみると

char buf[17];
fgets(buf, 17, f);

前の例とまったく同じことを行います-文字列に改行文字が保存されています(この場合、null文字がどこに保存されているかわかりません)

改行で行全体を読み取るには、これを行う必要があります

char buf[18];
fgets(buf, 18, f);

またはこれ(動作しますが、安全かどうかはわかりません)

char buf[17];
fgets(buf, 18, f);

質問は、行に15文字+改行しかないのに、なぜ18文字を割り当てて読み取る必要があるのですか?

4

2 に答える 2

1

1行を読み込もうとしていますが、改行文字がどのように表されているのかわかりません。

テキストモードでは、改行は'\ n'であり、これはすべての準拠C実装に当てはまり、テキストモードストリーム以外ではfgetsを使用しません(わかりません-そして知りたくありません- \ rを行末マーカーとして使用する実装で、またはさらに悪いことに、帯域外の行末マーカーを使用する実装でバイナリモードでどのように機能するか、\ nを探して、それを見つけられないので、読んでみてください。ファイルの終わりまで)。

最大行長にスペースを割り当てる必要があります。これには、改行と終了NULが含まれます。さらに重要なのは、バッファーの長さについてfgetsを絶対に使用しないことです。改行が存在しない場合は改行が存在しないため、バッファが十分に長いかどうかを確認できます。

于 2012-11-17T14:32:02.613 に答える
1

\r\n15 文字のテキスト用のバッファ スペース、新しい行用に最大 2 文字 (の Windows 行終端を処理するため)、および null 終端用にもう 1文字を提供する必要があります。それで18です。

あなたがここでしたように:

char buf[18]; fgets(buf, 18, f);

numパラメータ toは、fgets書き込み先のバッファのサイズを呼び出しに伝えます。

于 2012-11-17T14:25:54.920 に答える