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

由于每一行的长度可能不同,因此如果不先读取所有前面的行,就无法知道它在文件中的位置。因此,您需要在计算换行符的同时通读文件以了解每行的字节偏移量——如果您决定这样做,请在生成线程之前执行此操作,否则它们将重复这项工作。

当然,您可以更改行为,以便按字节而不是按行划分文件,并寻找给定的字节偏移量,然后从那里跳到下一个换行符(并允许具有前面字节范围的线程超过其范围直到行尾,以确保覆盖分割线)。

此外,您需要为每个线程提供自己的文件句柄,否则一个线程中的操作会影响其他线程中的文件位置。

于 2013-11-10T09:30:13.063 回答
0

每个线程都需要自己的文件句柄。启动10个线程,fopen在每个线程中,fseek在每个线程中根据线程id和stride。

于 2013-11-10T09:27:01.620 回答