C 线程到多搜索文件

C 线程到多搜索文件,c,file,pthreads,fseek,C,File,Pthreads,Fseek,我打开文件: FILE *fp = fopen("test.txt", "r"); 文件如下所示: cookie monster test ... 我创建了10个线程pthread\u create 每个线程将在文件中查找字符串。我想把文件分成几个部分 问题 我不想把整个文件读入内存,因为.txt文件会很大。 所以我的方法是寻找。所以我会给每个线程一个数量的行来搜索 所以Thread1得到第1到50行,Thread2得到第51到101行,Thread3得到第102到152行 我该怎

我打开文件:

FILE *fp = fopen("test.txt", "r");
文件如下所示:

cookie    
monster 
test
...
我创建了10个线程
pthread\u create

每个线程将在文件中查找字符串。我想把文件分成几个部分

问题

我不想把整个文件读入内存,因为.txt文件会很大。 所以我的方法是寻找。所以我会给每个线程一个数量的行来搜索

所以Thread1得到第1到50行,Thread2得到第51到101行,Thread3得到第102到152行

我该怎么说,先去51号线,然后再去102号线,等等

fseek(fp,51,SEEK_SET);//不是这样的


每个线程都需要自己的文件句柄。开始10个线程,
fopen
在每个线程中,根据线程id和跨步在每个线程中
fseek

每个线程都需要自己的文件句柄。开始10个线程,
fopen
在每个线程中,
fseek
根据线程id和跨距在每个线程中。

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

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


此外,您需要为每个线程指定其在文件上的句柄,否则一个线程中的操作将影响其他线程中的文件位置。

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

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


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

我计划这样做,启动每个线程中的线程,
fopen
,但我如何告诉它寻找正确的位置?有没有办法告诉fseek转到一个新的行?我计划这样做,在每个行中启动线程,
fopen
,但是我如何告诉它寻找正确的位置?有没有办法告诉fseek换一条新线路?让我再跟你核实一下。我能看完整个文件。每次有新行时,我都可以保存该行的索引。例如:
int*索引然后在文件中循环时,将索引保存到我的数组中,然后使用该数组进行搜索。@MikeJohn是的,首先构建线偏移的索引,然后使用该索引生成要搜索的线程。听起来不错。您推荐的从文件中读取整行的有效方法是什么?可能只是
fgets
,缓冲区足够大,可以容纳假定的最大行长,然后只检查缓冲区中的最后一个字符作为换行符。或者只是逐字节读取,操作系统可能会对其进行缓冲,因此这可能同样好,如果不是更好的话。但是,尽管如此,我还是建议您将文件按字节而不是按行分割,这样您就不必构建索引,工作可能会更均匀地分割。让我再次与您确认一下。我能看完整个文件。每次有新行时,我都可以保存该行的索引。例如:
int*索引然后在文件中循环时,将索引保存到我的数组中,然后使用该数组进行搜索。@MikeJohn是的,首先构建线偏移的索引,然后使用该索引生成要搜索的线程。听起来不错。您推荐的从文件中读取整行的有效方法是什么?可能只是
fgets
,缓冲区足够大,可以容纳假定的最大行长,然后只检查缓冲区中的最后一个字符作为换行符。或者只是逐字节读取,操作系统可能会对其进行缓冲,因此这可能同样好,如果不是更好的话。但是,尽管如此,我还是建议将文件按字节而不是按行分割,这样您就不必构建索引,工作可能会更均匀地分割。