我有一个包含数据(有符号数字)的文件,排列如下:
291
-1332
912
915
-1347
196
1110
-997
120
1017
-775
-443
985
13
-690
369
673
-826
-14
891
-546...(thousands of lines)
我想使用一个函数将我的文件指针移动到 ex.1100 的特定行数
目前我正在使用以下代码跳过并转到特定行/编号
if (offset>0)//offset is number of destination line
{
while(fscanf(f,"%d",&buffer)!=EOF) //f is file pointer ;Buffer is int variable
{
i++;
if(i==offset)
break;
}
}
我想使用比这更好的代码,因为随着偏移量的增加,该代码需要更多时间, 有什么想法可以以简单的方式(并且时间更短)实现这一点?
最佳答案
如果所有数字的长度(例如)为 6 个字符,并且每行末尾有一个 \n
换行符,则可以到达行号 n
(从零开始)通过 fseek 到 n * 7
。第 0 行的偏移量为 0,第 1 行的偏移量为 7,第 2 行的偏移量为 14,依此类推。
同样,第 1100 行(第 1101 行)可以通过以下方式访问:
if (fseek (f, 7700L, SEEK_SET) != 0) {
// something went wrong.
}
if (fscanf (f, "%d", &buffer) != 1) {
// something else went wrong.
}
这适用于任何固定宽度的线,您只需根据线宽和行结尾调整乘法因子(例如,DOS 编码可能有两个 em> 字符,\r\n
)。
当然,您可能会发现将整个文件读入内存中的整数数组(取决于有多少)是有利的,这样对数据的随机访问就会变得快得令人眼花缭乱 -这是因为在初始加载后没有理由返回文件以获取任何数据。
关于c - 使用 C 在文件中垂直查找数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18997649/