Как быстро прочитать заданную строку из файла в обратном направлении? - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть задача записать 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

Результатывсе в порядке, но процесс идет медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...