0

私はファイルを開きます:

FILE *fp = fopen("test.txt", "r");

ファイルは次のようになります。

cookie    
monster 
test
...

10 スレッドを作成しますpthread_create

各スレッドは、ファイル内の文字列を探します。ファイルをセクションに分割したい。

問題

.txt ファイルが巨大になるため、ファイル全体をメモリに読み込みたくありません。だから私のアプローチは求めることです。したがって、各スレッドに検索する行数を指定します。

したがって、Thread1 は 1 行目から 50 行目を取得し、Thread2 は 51 行目から 101 行目を取得し、Thread3 は 102 行目から 152 行目を取得します。

51 行目をシークしてから 102 行目をシークする、などと言うにはどうすればよいでしょうか?

fseek (fp、51、SEEK_SET); // そうしない

4

2 に答える 2

4

各行はおそらく同じ長さではないため、最初に前の行をすべて読み取らないと、ファイル内の位置を知ることはできません。そのため、各行のバイト オフセットを知るために改行を数えながらファイルを読み取る必要があります。これを行う場合は、スレッドを生成する前に行います。そうしないと、この作業が重複します。

もちろん、ファイルを行単位ではなくバイト単位で分割し、指定されたバイト オフセットをシークし、そこから次の改行までスキップするように動作を変更できます (そして、前のバイト範囲を持つスレッドがその範囲を超えることを許可します)。分割線が確実にカバーされるように、行末までの範囲)。

また、各スレッドにファイルの独自のハンドルを与える必要があります。そうしないと、1 つのスレッドでのアクションが他のスレッドのファイル位置に影響します。

于 2013-11-10T09:30:13.063 に答える
0

各スレッドには、ファイルへの独自のハンドルが必要です。スレッド ID とストライドに従って、fopen各スレッドで10 個のスレッドを開始します。fseek

于 2013-11-10T09:27:01.620 に答える