Откройте файл и распечатайте строку с определенным номером в C? - PullRequest
1 голос
/ 20 февраля 2011

Я знаю, что это очень простая вещь, но я не очень хорош в обработке файлов в C.

Я пишу собственный обработчик ошибок для чего-то, и он должен открыть файл, найти строку по его номеру и сохранить его в char *.

Может кто-нибудь предложить способ сделать это?

Редактировать: Что я делаю не так? Иногда он получает правильную линию, но иногда пропускает:

if (file_available)
            {
                char str_buf[81];
                int counter = 0;
                FILE *fp;
                fp=fopen(error_filename, "r");
                while (error_lineno != counter)
                {
                    fgets(str_buf, 81, fp);
                    counter += 1;
                }

                php_printf(html_formats[5],"Line",str_buf);
                fclose(fp);
            }

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Если у вас есть доступ к библиотеке GNU C, вы можете использовать getline:

FILE *f;
char *line = NULL;
size_t line_size = 0;
int i=0;

/* Open the file, or get access it to it however you will */

for(; i <= requestedLine; ++i) {
    if ( getline(&line, &line_size, f) == -1 ) {
        //error condition, log / bail
    }
}

/* line now holds the line number you want, do whatever you want with it */

fclose(f);
if (line) {
    /* guard against the empty file case */
    free(line);
}

getline захватит для вас полную строку и решит большинство проблем с выделением памяти. Первый параметр - это указатель на буфер char* (как в char** - указатель на указатель на начало char буфера), а второй - размер этого буфера. Если буфер недостаточно велик, getline создаст новый буфер, достаточно большой, чтобы вместить строку и очистить ваш старый (выполняет realloc). Когда функция вернется, первый параметр теперь будет указывать на новый буфер, который содержит строку, а второй параметр также будет обновлен для хранения нового размера буфера. Третий параметр - это просто объект FILE* для чтения. getline вернет -1 при ошибке, поэтому в этом случае мы регистрируем / освобождаем залог.

Обратите внимание, что когда все будет сделано, вам все еще нужно освободить буфер, который создает getline.

2 голосов
/ 20 февраля 2011

Вы можете написать цикл с fgets() для чтения строк, пока не доберетесь до нужного:

inputFile = fopen(filename, "r");
while (whichLine--)
{
    fgets(buffer, sizeof buffer, inputFile);
}
fclose(inputFile);

Добавьте обработку ошибок и дополнительную информацию на свой вкус.

...