如果我读取二进制文件,我可以使用以下命令定位第 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 个?
谢谢!
如果我读取二进制文件,我可以使用以下命令定位第 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 个?
谢谢!
基本上你在问当行长度可变时如何定位第 n 行。
好吧,这样做的唯一方法是浏览文件并计算'\n'
字符数。
简短的回答是您不能在具有可变记录长度的文件中进行随机搜索。这是移动到可变记录长度时要付出的代价。您可以通过填充将可变记录长度转换为固定记录长度。不过,这会带来额外的存储成本。如果随机搜索很重要,那么这是一个值得妥协的方案。
你不能;文本文件不包含有关行长的任何信息。
您将需要阅读每个字符,并计算行尾字符。如果这太慢,那么您可以维护单独的行位置索引(在此文件的标题中或单独的文件中),或更改格式以使用固定长度的记录。
你不能。您必须通读文件并计算行尾数;类似的东西:
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--;
}
}
(注意:没有错误检查:-))