1

如果我读取二进制文件,我可以使用以下命令定位第 n 行:

fseek(fp, 4*sizeof(line),SEEK_SET);

但是在 C 中读取 txt 文件时,例如:

1 1 2.2
2 3 3.001
3 4 5

我无法确保行的字节大小,因为在实际情况下双值可以是 2.2 或 3.0001 或 5。这次如何使用 fseek 定位第 n 个?

谢谢!

4

4 回答 4

6

基本上你在问当行长度可变时如何定位第 n 行。

好吧,这样做的唯一方法是浏览文件并计算'\n'字符数。

于 2012-08-28T11:06:31.210 回答
2

简短的回答是您不能在具有可变记录长度的文件中进行随机搜索。这是移动到可变记录长度时要付出的代价。您可以通过填充将可变记录长度转换为固定记录长度。不过,这会带来额外的存储成本。如果随机搜索很重要,那么这是一个值得妥协的方案。

于 2012-08-28T11:06:58.037 回答
2

你不能;文本文件不包含有关行长的任何信息。

您将需要阅读每个字符,并计算行尾字符。如果这太慢,那么您可以维护单独的行位置索引(在此文件的标题中或单独的文件中),或更改格式以使用固定长度的记录。

于 2012-08-28T11:07:51.173 回答
0

你不能。您必须通读文件并计算行尾数;类似的东西:

void GotoLine(FILE* File, unsigned int Line)
{
    int c;

    fseek(File,0,SEEK_SET);
    while (Line>0 && (c=fgetc(File))!=EOF)
    {
        if (c=='\n') Line--;
    }
}

(注意:没有错误检查:-))

于 2012-08-28T11:07:09.710 回答