9

ファイルを読み取って、そのファイルから文字列にテキストを送信して、解析できるようにする必要があります。ただし、プログラムはファイルの長さを正確に認識しないので、使用したい場合はどうすればfgets()よいですか、またはより良い代替手段がありますか?

ノート:

char *fgets(char *str, size_t num, FILE *stream);
4

4 に答える 4

10

fgets()十分なスペースがあることを条件として、一度に1行ずつ読み取ることを忘れないでください。

人間が...80、256より長い行を書くことはめったになく、数字を選ぶ...文字。POSIXは、行の長さ4096を提案しています。したがって、私は通常、次のものを使用します。

char buffer[4096];

while (fgets(buffer, sizeof(buffer), fp)) 
{
    ...process line...
}

誰かが1行で4Kを超えるデータを提供する可能性がある(そしてHTMLやJSONなどのマシン生成ファイルにそれが含まれる可能性がある)ことが心配な場合は、次に何をするかを決定する必要があります。次のいずれかを実行できます(そして、私が言及していない他のオプションがいくつかある可能性があります)。

  1. 間に改行があると想定せずに、長すぎる行をビット単位で処理します。
  2. より長い行(最初は8Kなど)にメモリを割り当て、割り当てられたバッファに最初の4Kをコピーし、バッファの後半にさらにデータを読み取り、行の終わりが見つかるまで繰り返します。
  3. Linuxで利用可能なPOSIX2008関数getline()を使用します。それはあなたのためにメモリ割り当てを行います。
于 2010-05-21T04:40:04.427 に答える
3

fgetsを繰り返し使用できますが、より簡単な代替手段は(stdio.hの)getlineです。POSIXにありますが、標準のCではありません。

ただし、C ++を使用しているので、iostreamのgetlineのようなstd :: string関数を使用できますか?

于 2010-05-21T04:25:07.663 に答える
3

POSIXシステムを使用しておらず、getline利用できない場合は、バッファを動的に拡張して行全体を消費するChuckFalconerのパブリックドメインggets/fggets関数を確認してください。(そのリンクは現在ダウンしているようですが、archive.orgにコピーがあります。)

于 2010-05-21T05:16:55.213 に答える
0

strバッファ(を指すバッファ)を割り当て、バッファのサイズをに渡しnumます。実際に使用されるスペースは、によって読み取られるテキストの長さのみになりますfgets

何かのようなもの:

char str[1000];
fgets(str, 1000, &file);

次の行の改行の前に10文字しかない場合、strはそれらの10文字、改行、およびヌルターミネータを保持します。

編集:混乱が生じた場合に備えて、バッファ内の余分なスペースが使用されていないかのように上記を鳴らすつもりはありませんでした。弦に最大の長さを付けることができる限り、弦の長さを事前に知る必要がないことを説明することだけを目的としています。

于 2010-05-21T04:24:47.030 に答える