C: getline не читает весь документ

Мне нужно написать программу на C, читающую большой XML-файл с помощью getline, проблема в том, что читаются только 2085 из примерно 3 миллиардов строк. В следующем коде возникает проблема.

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()                                          
{
    size_t l = 0;
    char *line;

    line = NULL;
    while (getline(&line,&l,stdin)>0) {

        getline(&line,&l,stdin);
        printf("%s\n", line);
        printf("%i\n", i);

        free(line);
        line = NULL;
    }
    return 0;
}

Моей первой целью было бы отобразить строки с помощью printf, чтобы я мог с этим работать. Ни одна строка с 2080 по 2090 год не пуста. Если я изменю условие цикла на >=0, будет прочитано около 80 000 строк, а если я прокомментирую printf, то получится около 130 00 строк. Но вместо этого я получаю ошибку сегментации. Который я действительно не знаю, как решить в этом случае. Я использую код Visual Studio для редактирования и MYSYS2 MinGW для запуска кода в Windows 11. Сначала не удалось найти функцию getline, я решил ее, скопировав и вставив код getline страницы это, потому что заголовок #include, похоже, не работал.

Я не рекомендую использовать реализации отдельных функций из других библиотек. Лучше использовать имеющиеся у вас библиотеки. Если специфичная для платформы функция getline действительно недоступна, я рекомендую вместо нее использовать не зависящую от платформы функцию fgets.

Andreas Wenzel 16.05.2022 22:35

Почему вы проверяете возвращаемое значение первого вызова getline, но не проверяете возвращаемое значение второго вызова getline? Кроме того, почему вы звоните getline во второй раз? Вызов getline один раз за итерацию цикла кажется более подходящим.

Andreas Wenzel 16.05.2022 22:38

@AndreasWenzel getline автоматически выделяет память. Это значительно упрощает управление памятью

0___________ 16.05.2022 22:42

@0___________ Почти так же просто, как C++ :)

Paul Sanders 17.05.2022 01:35
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Вы пропускаете каждую вторую строку, когда читаете строку в while, затем снова читаете ее в теле while
  2. У вас утечка памяти (та же причина, что и в пункте 1)
int main(void)                                          
{
    size_t l = 0;
    ssize_t retVal;
    char *line;

    line = NULL;
    do 
    {
        if((retVal = getline(&line,&l,stdin)) != -1)
        {
            printf("Buff_size:%zu Line_length: %zd Line:\"%s\"\n", l, retVal, line);

        }
    }while(retVal != -1);
    free(line);
    return 0;
}

Большое спасибо! Этот код работает даже с копией-вставленной версией функции getline.

Aleayn 16.05.2022 23:07

Другие вопросы по теме