我打开文件:
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); //不这样做
答案 0 :(得分:4)
由于每条线的长度可能不同,因此如果不首先读取所有前面的行,就无法知道它在文件中的位置。因此,您需要在计算换行数时读取文件以了解每行的字节偏移量 - 如果您决定这样做,请在生成线程之前执行此操作,否则他们将复制此工作。
当然你可以改变行为,以便按字节而不是按行划分文件,并寻找给定的字节偏移量,然后从那里跳到下一个换行符(并允许具有前面字节范围的线程)超出其范围直到行尾,以确保分割线被覆盖。)
此外,您需要为每个线程赋予文件自己的句柄,否则一个线程中的操作将影响其他线程中的文件位置。
答案 1 :(得分:0)
每个线程都需要自己的文件句柄。根据线程ID和步幅,在每个线程中启动10个线程fopen
,每个线程fseek
。