Если я читаю строки из файла .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
}
}
Ответ Бена был настолько хорош, что должен быть частью ответа
Установите errno в 0 перед вызовом strtol.
Проверьте ошибочно. С man страницы
ERANGE
Полученное значение было вне диапазона.
Реализация может также установить errno на EINVAL, если преобразование не было выполнено (цифры не видны, а 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>{}
};
}
Вы выбрасываете информацию, доступную из strtol
,
В частности, после звонка
val = strtol(p, &endp, radix);
вы заинтересованы в том, p == endp
,
В вашем звонке strtol(p, &p, radix)
ты перезаписываешь p
слишком рано и теряет шанс выполнить тест.