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);
// ...