Как fgets () конкретная строка из файла в C? - PullRequest
5 голосов
/ 18 ноября 2011

Итак, я пытаюсь найти способ fgets () определенной строки в текстовом файле на C, чтобы скопировать содержимое строки в более постоянный буфер:

По сути, мне было интересно, есть ли способ сделать это без чего-то похожего на следующий код:

FILE *fp;
fp = fopen(filename, "r");

char line[256];
char * buffer;
int targetline = 10;
while( targetline > 0)
{
    fgets(line, 256, fp)
}

buffer =(char*)malloc(sizeof(char) * strlen(line));
strcpy(buffer, line);

Так что, по сути, я не хочу перебирать файл n-1 раз просто для того, чтобы перейти к n-й строке ... он просто не кажется очень эффективным (и, поскольку это домашняя работа, мне нужно получить 100 % ха-ха).

Любая помощь будет оценена.

Ответы [ 5 ]

8 голосов
/ 18 ноября 2011

Если вы знаете длину каждой строки, вы можете использовать fseek для перехода к нужной строке.

В противном случае вам нужно пройти все строки.

7 голосов
/ 18 ноября 2011

Если вы не знаете что-то больше о файле, вы не можете получить доступ к определенным строкам в случайном порядке.Новые строки ограничиваются наличием символов конца строки, и они, как правило, могут встречаться где угодно.Текстовые файлы не поставляются с картой или индексом , которая позволила бы перейти к строке n th .

Если вы знали, чтоСкажем, каждая строка в файле имеет одинаковую длину, тогда вы можете использовать произвольный доступ для перехода к определенной строке.Без дополнительных знаний такого рода у вас просто не останется иного выбора, кроме как перебирать весь файл до тех пор, пока вы не достигнете нужной строки.

5 голосов
/ 18 ноября 2011

Во-первых, ваша строка

buffer =(char*)malloc(sizeof(char) * strlen(line));

лучше записывается как:

buffer = malloc(strlen(line) + 1);

+ 1 необходим для предоставления места для завершающего символа '\0';strlen() не учитывает это.Приведение результата malloc() в C необязательно, и в некоторых случаях может маскировать ошибки.sizeof(char) равен 1 по определению, поэтому в этом нет необходимости.

И вы никогда не измените значение targetline, поэтому ваш цикл никогда не прекратится.

Но в ответ на ваш вопрос,Если у вас есть текстовый файл, и вы хотите прочитать его N-ую строку, вы должны прочитать и пропустить первые N-1 строки, чтобы добраться до него.(Можно настроить отдельный индекс, но создание индекса в любом случае требует чтения файла, и поддержание индекса в актуальном состоянии при изменении файла - сложная проблема, возможно, выходящая за рамки того, что вы делаете сейчас. И в этом нет особой необходимости;время чтения 10 строк из файла не будет заметно.)

3 голосов
/ 18 ноября 2011

Боюсь, нет другого способа получить n-ую строку в файле.Вы должны пройти.В файле нет случайного доступа.

2 голосов
/ 18 ноября 2011

Если вы хотите получить n-ю строку из текстового файла, вы должны прочитать n-1 строки перед ним.Такова природа последовательного файла.Если вы не знаете, что все ваши строки имеют одинаковую длину, невозможно надежно расположить начало конкретной строки.

...