我有一个包含数据(有符号数字)的文件,排列如下:
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;
}
}
我想使用比这更好的代码,因为此代码在偏移量增加时需要更多时间, 有任何想法以简单的方式(以及更短的时间)实现这一点吗?
答案 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)
你有一些选择。如果您 必须 保留数字的文本文件,并且由于每行都是可变长度,您可以: