Как определить, что вы достигли конца строки целых чисел fgets, когда 0 — последнее целое число в строке, используя c ++?

Если я читаю строки из файла .txt различной длины (то есть 5 целых чисел в строке 1, затем 2 целых числа в строке 2, 10 целых чисел в строке 3 и т. Д.), Используя fgets (хотя я не Т обязательно нужно его использовать, просто показалось хорошим инструментом в моей ситуации). Каждое решение, которое я нахожу, возвращает ошибку 0 (например, strtol или atio).

char str[100];
char* p = str;
FILE* fp;
fp = open("text.txt",r);
if(fp == NULL)
printf("aborting.. Cannot open file! \n");
while(!foef(fp))
{
if(fgets(p,100,fp) != NULL)
{
for (int j = 0 ; j < 20 ; j+=2)
{
temp1 = strtol(p, &p, 10);
// need to store temp1 into arr[j] if it is a valid integer (0->inf)
// but should discard if we are at the end of the line
}
}

2

Решение

Ответ Бена был настолько хорош, что должен быть частью ответа

Установите errno в 0 перед вызовом strtol.

Проверьте ошибочно. С man страницы

ERANGE

Полученное значение было вне диапазона.
Реализация может также установить errno на EINVAL, если преобразование не было выполнено (цифры не видны, а 0 возвращено).

0

Другие решения

Вы могли бы на самом деле использовать C ++:

std::ifstream file("text.txt");
std::string line;
while (std::getline(file, line)) {
std::istringstream iss(line);
int i;
while (iss >> i) {
// ...
}
}

Внутренний цикл может просто загрузить все целые числа в вектор напрямую или что-то в этом роде:

std::ifstream file("text.txt");
std::string line;
while (std::getline(file, line)) {
std::istringstream iss(line);
std::vector<int> all_the_ints{
std::istream_iterator<int>{iss},
std::istream_iterator<int>{}
};
}
0

Вы выбрасываете информацию, доступную из strtol,

В частности, после звонка

val = strtol(p, &endp, radix);

вы заинтересованы в том, p == endp,

В вашем звонке strtol(p, &p, radix) ты перезаписываешь p слишком рано и теряет шанс выполнить тест.

0