Чтение длинных ASCII-файлов на C - PullRequest
1 голос
/ 25 октября 2009

В C, если я читаю строку из файла функцией fgetc, возможно, переполнение стека. Предположим, что некоторые написали программу, которая выводит огромную строку данных ASCII в одну строку в определенном файле. Как я могу прочитать эти данные в моей C-программе на экран? Я знаю, что могу читать только, скажем, 100 символов одновременно, но я не знаю, как начать чтение с определенной позиции.

Ответы [ 4 ]

1 голос
/ 25 октября 2009

вы можете динамически распределять массив символов с помощью malloc (), а затем читать символ из файла с помощью fgetc (). когда вы достигаете конца буфера, вы вызываете realloc (), чтобы расширить буфер, а затем продолжаете чтение символов. таким образом, единственная ошибка, которую вы можете иметь, это ошибка «недостаточно памяти».

char *buffer = malloc( 200 );
unsigned int buffer_size = 200;
unsigned int current = 0;
char read;

do
{
    read = fgetc( stream );
    if ( current >= buffer_size - 1 )
    {
        buffer_size += 200;
        buffer = realloc( buffer, buffer_size );
    }
    buffer[current++] = read;
}
while ( read != '\n' );
buffer[current++] = '\0';

(отсутствует в приведенном выше коде: проверка возвращаемого значения realloc для обработки состояния нехватки памяти)

1 голос
/ 25 октября 2009

Вы можете использовать функцию read () для чтения с заданным размером за раз (скажем, 100 байтов). Вы просто продолжаете делать это в цикле, пока read () не покажет, что читать нечего. read () возвращает количество прочитанных байтов, поэтому, когда оно возвращает меньше запрошенного вами байта, вы знаете, что все готово.

1 голос
/ 25 октября 2009

также посмотрите на mmap()

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

Кто бы ни осудил меня, я бы очень хотел увидеть ваше объяснение того, почему поиск и чтение лучше, чем mmap для этого

0 голосов
/ 25 октября 2009

Обратитесь к fseek () и ftell ().

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