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

时间:2013-09-25 06:22:43

标签: 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;
    }

}

我想使用比这更好的代码,因为此代码在偏移量增加时需要更多时间, 有任何想法以简单的方式(以及更短的时间)实现这一点吗?

2 个答案:

答案 0 :(得分:1)

如果您的所有数字(例如)长度为六个字符,并且每行末尾都有一个\n换行符,则可以使用行号n(零 - 通过fseeking到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编码可能 2 characters,\r\n)。

当然,您可能会发现将整个文件读入内存中的整数数组是有利的(取决于 数千个),以便随机访问数据变得非常快 - 这是因为在初始加载后没有理由返回文件中的任何数据。

答案 1 :(得分:1)

你有一些选择。如果您 必须 保留数字的文本文件,并且由于每行都是可变长度,您可以:

  • mmap(内存映射)文件的内容并将行号索引到数组中。为此,您需要对文件进行一次传递,并生成每行开始的文件偏移数组。
  • 将文件重写为二进制数据(例如,整数数组) - 由于每个整数都在nth_int * sizeof(int)中找到,因此它更紧凑,搜索速度更快。您在开始时支付一次罚款以重新写入文件。
  • 在很大程度上取决于您的环境和使用案例,这是您更好的判断规则。最重要的是,测试并测量它是否值得。