2012-01-29 4 views
2

長いテキスト行を含むかもしれないテキストファイルを読む必要があります。私はこれを行う最善の方法を考えています。効率を考えると、私はC++でこれをやっていますが、IOを行うためにCライブラリ関数を選択しています。Cのテキストファイルを読むのに良い方法

私は線がどれくらい長いのか分からないので、大きな配列を割り当ててからfgetsを使って行を読みたいとは思いません。一方、私は各行がどこで終わるかを知る必要があります。そのような場合の1つの使用例は、各行の単語/文字を数えることです。私は小さな配列を割り当てて、\r,\n、または\r\nが存在するかどうかを調べて、完全な行が読み込まれているかどうかを調べるために、fgetsを使用して読み取ることができます。しかし、これには多くのstrstrコールが含まれています(\r\nの場合や、fgetsの戻り値などのより良い方法があります)。また、一度に1つずつ個々の文字を読むには、fgetcを実行することもできます。しかし、この関数はバッファリングを持っていますか?

このタスクを実行する際のこれらの方法または他のさまざまな方法を比較することをお勧めします。

+6

C++と 'std :: string'と' std :: getline'を使用してください。何故なの?プロファイルが遅すぎると主張する前にプロフィール –

+0

'fgets()'は、通常の状況下では行末として '\ r'を読みません。 POSIX 2008と['getline()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)を見てください。しかし、それを使うことによる移植性の影響に注意してください。 POSIXの 'getline()'であっても、単一の区切り文字のみを扱う(getdelim()と同様に)。同じページ)。 –

+0

fread()またはread()でファイル全体を読み込み、 '\ n'を検索します。同様のことはmmap()を使って行うことができます。 – wildplasser

答えて

2

I/Oを行う正しい方法は、データの処理内容によって異なります。あなたが単語を数えているなら、行ベースの入力はあまり意味がありません。より自然なアプローチは、一度にfgetcを使用して文字を処理し、stdioがバッファリングを心配するようにすることです。メモリ内の行全体を同時に処理する必要がある場合にのみ、実際にそれを格納するのに十分な大きさのバッファを実際に割り当てる必要があります。

関連する問題