У меня есть задача записать n-ю строку из файла в обратном направлении на C. Строки расположены в обратном порядке (последняя строка 1, затем две, ... затем первая строка n).Мне нужно найти строку k и написать ее задом наперед.Строки ограничены символами 0x0D и 0x0A.
Мне удалось сделать это неуклюже, медленно, читая назад каждые два символа.Один из тестов для кода не проходит, потому что он слишком медленный.Это лучший способ сделать это?Любой код будет очень кстати.(Я ограничен использованием только lseek, читай ... - я не могу использовать getline () или что-то в этом роде.)
int get_line(int fd, int lineNr, int begin, int size, int end)
{
char newC = 0;
char oldC = 0;
int linieCurenta = 1; //currentLine
int oldPos = end;
int newPos = end;
int linieGasita = FALSE; //check if the line was found
char line[PATHSIZE];
lseek(fd, end, SEEK_SET);
for(int i = end; i > begin; i--)
{
lseek(fd, -1, SEEK_CUR);
oldC = newC;
if(read(fd, &newC, 1) != 1)
{
perror("Reading error");
break;
}
lseek(fd, -1, SEEK_CUR);
if((newC == 0x0D && oldC == 0x0A) || i == begin + 1)
{
oldPos = newPos;
newPos = i - 2;
if(linieCurenta == lineNr) //If currentLine = lineNr
{
linieGasita = TRUE; //found
break;
}
linieCurenta++;
}
}
if(linieGasita == 0)
{
printf("ERROR\ninvalid line\n");
return -3;
}
lseek(fd, oldPos + 1, SEEK_SET);
printf("SUCCESS\n");
int start = 0; int limit = 0;
int cnt = 0;
//A way of writing longer than 2048 characters lines.
while(limit < oldPos - newPos) {
if(limit + PATHSIZE < oldPos - newPos) {
start = limit;
limit += PATHSIZE;
} else {
start = limit;
limit = oldPos - newPos;
}
cnt = 0;
for(int i = start; i < limit; i++) //Linie prea mare
{
lseek(fd, -1, SEEK_CUR);
if(read(fd, &line[cnt++], 1) != 1)
{
perror("Reading error...");
return -5;
}
lseek(fd, -1, SEEK_CUR);
}
cnt = 0;
//I have to print the line here, like this.
for(int i = start; i < limit; i++)
{
printf("%c", line[cnt++]);
}
}
return 0;
}
PATHSIZE определено в 2048
Результатывсе в порядке, но процесс идет медленно.