Мне нужно написать программу на 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
, но не проверяете возвращаемое значение второго вызова getline
? Кроме того, почему вы звоните getline
во второй раз? Вызов getline
один раз за итерацию цикла кажется более подходящим.
@AndreasWenzel getline автоматически выделяет память. Это значительно упрощает управление памятью
@0___________ Почти так же просто, как C++ :)
while
, затем снова читаете ее в теле whileint 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.
Я не рекомендую использовать реализации отдельных функций из других библиотек. Лучше использовать имеющиеся у вас библиотеки. Если специфичная для платформы функция
getline
действительно недоступна, я рекомендую вместо нее использовать не зависящую от платформы функциюfgets
.