如何读取两个字节位置之间的文件行

时间:2016-02-04 03:05:16

标签: c

我正在读取偏移位置(文件的四分之一)到结尾的文件行:

struct stat st;
stat("file.txt", &st);
int fileSize = st.st_size
int minOffset = fileSize/4;
FILE* file_ptr = fopen("file.txt", "r");
fseek(file_ptr, minOffset, SEEK_SET);

int lineLength = 1000;
char * line; 
line = malloc(lineLength);

while (read = getline(&line, &lineLength, file_ptr) != -1) {
   printf("%s", line);
}

但我需要的是读取文件中两个字节位置之间的所有行。正如奥拉夫在评论中指出的那样,我还有一个问题,即我的偏移量在线边界处是不必要的。

例如,这可能是我想阅读的maxOffset:

int maxOffset = fileSize / 2; 

我想从minOffset位置到maxOffset位置之前的行读取。

该文件由单词(逐行)组成,其长度始终小于1000:

AA
AAS
ABACA
ABACAS
ABACOST
ABACOSTS
ABACULE
ABACULES
ABAISSA
ABAISSABLE
ABAISSABLES
ABAISSAI
ABAISSAIENT
ABAISSAIS
ABAISSAIT
ABAISSAMES
ABAISSANT
ABAISSANTE
ABAISSANTES
ABAISSANTS
ABAISSAS
ABAISSASSE
ABAISSASSENT
ABAISSASSES
ABAISSASSIEZ
ABAISSASSIONS
ABAISSAT
ABAISSATES 
....

如何读取两个字节位置之间的文件行?

2 个答案:

答案 0 :(得分:2)

你想要函数fread

int byteStart = 100;
int byteEnd   = 200;
line = malloc(byteEnd-byteStart);            // Allocate enough space for your data.
fseek(file_ptr, byteStart, SEEK_SET);        // Go to your starting point
fread(line, 1, byteEnd-byteStart, file_ptr); // Read until your ending point.

答案 1 :(得分:2)

首先,您需要在1 / 4,1 / 2和3/4点找到线起点的字节位置。要做到这一点:

  • fseek到大致位置(例如fseek(filesize/4)
  • 致电fgets以阅读下一个换行符
  • 致电ftell确定抵消

返回的偏移量是四分之一的结束和下一个季度的开始。

阅读文件的四分之一:

  • fseek到本季度开始
  • 致电fgets阅读一行
  • 致电ftell,了解您是否已达到季度末