c - 使用 C 在文件中垂直查找数据

标签 c file seek

我有一个包含数据(有符号数字)的文件,排列如下:

   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/

相关文章:

c - 如何在c中创建文件夹?

linux - 为什么此代码会导致核心转储?

转换字符串时间戳 HH :MM:SS to an integer in C

BZ2_bzBuffToBuffCompress()可以重复调用吗?

c - 如何仅针对特定行将文本文件中的单词读入数组?

java - 从 File[] 文件到目录

regex - 如何使用 perl 脚本从文件中删除选定的重复行

python-2.7 - 如何查看 Python 3 文件中的下一个字符?

ios - 平移寻找AVPlayer

linux - 如何使 lseek64 _actually_ 返回 64 位偏移量?