在您的情况下,我建议使用 getline 进行阅读,使用 ftell 和 fseek 获取/设置偏移量(以及使用 strstr 搜索单个行)。
我不确定我是否理解您保存偏移量的全部内容,但它可能看起来像这样:
int pick_lines(const char *filename, const char *keyword, long *offset)
{
FILE *fp;
char *line = NULL;
size_t len = 0;
if (offset == NULL || (fp = fopen(filename, "r")) == NULL)
return 1;
if (*offset > 0 && fseek(fp, *offset, SEEK_SET) != 0) {
fclose(fp);
return 1;
}
while (getline(&line, &len, fp) != -1) {
if (strstr(line, keyword) != NULL)
printf("%s", line); // or do something else with chosen line
}
if ((*offset = ftell(fp)) < 0) {
free(line);
fclose(fp);
return 1;
}
free(line);
fclose(fp);
return 0;
}
这里offset 是一个输入/输出参数。它的取消引用值用于寻找给定的偏移量(以*offset == 0 开头),然后重置为新的偏移量。
这个函数只会打印包含keyword 的每一行。如果您想返回一个行数组,则需要做一些额外的工作。
一个使用示例可能是:
long offset = 0;
pick_lines(filename, keyword, &offset);
// append lines to file
pick_lines(filename, keyword, &offset);
// ...