2015-10-21 2 views
2

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

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 
} 
} 
+0

fp = open ("text.txt", r); должен быть fp = fopen ("text.txt", r); –

+0

Есть ли символ конца строки ('\ n') в конце строки целых чисел? –

+0

http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong –

ответ

0

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

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

Проверьте errno. От человека странице

ERANGE

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

+1

Обратите внимание, что вам нужно будет не только проверить его, но и сбросить его перед вызовом 'strtol', о котором вы заботитесь. В противном случае вы могли бы увидеть ошибку, которая произошла намного раньше. –

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 и теряете возможность выполнить тест.