2011-09-13 1 views
0

Мне было интересно Если бы я мог прыгать по позициям в текстовом файле. Предположим, у меня есть этот файл.Продвинутый указатель файла, чтобы пропустить число в файле

12 
8764 
2147483648 
2 
-1 

Всякий раз, когда я пытаюсь прочитать третий номер не будет читать, потому что его больше, чем максимальное число для 32-битной int.So всякий раз, когда я достичь третьего номера, он продолжает чтение второй снова и снова , Как я могу перейти к четвертому номеру?

+0

ли возможность использовать более длинные целые числа? –

ответ

6

Использование станд :: GetLine вместо оператора >> (станд :: IStream, Int)

std::istream infile(stuff); 
std::string line; 
while(std::getline(infile, line)) { 
    int result; 
    result = atoi(line.c_str()); 
    if (result) 
     std::cout << result; 
} 

Причина вы испытываете поведение, которое вы, что когда станд :: IStream пытается (и не удается) читать в целое число, он устанавливает флаг «badbit», что означает, что что-то пошло не так. Пока этот флаг флэш-памяти остается установленным, он ничего не сделает. Таким образом, на самом деле это не перечитывание в этой строке, оно ничего не делает и оставляет ценность, которая была там одна. Если вы хотите больше соответствовать тому, что у вас уже было, это, вероятно, как показано ниже. Вышеприведенный код проще и менее подвержен ошибкам.

std::istream infile(stuff); 
int result; 
infile >> result; //read first line 
while (infile.eof() == false) { //until end of file 
    if (infile.good()) { //make sure we actually read something 
     std::cout << result; 
    } else 
     infile.clear(); //if not, reset the flag, which should hopefully 
         // skip the problem. NOTE: if the number is REALLY 
         // big, you may read in the second half of the 
         // number as the next line! 
    infile >> result; //read next line 
} 
+0

С каких пор 'atoi' имеет перегруз для' std :: string' ?? –

+0

Я действительно хотел, чтобы это было ... –

+0

Если пожелания были источниками ... –

0

Вы можете сначала прочитать строку, а затем преобразовать строку в целое число, если сможете. Вот пример для файла:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

int main() 
{ 
    std::ifstream in("file"); 
    std::string line; 
    while (std::getline(in, line)) { 
     int value; 
     std::istringstream iss(line); 
     if (!(iss >> value)) { 
      std::istringstream iss(line); 
      unsigned int uvalue; 
      if (iss >> uvalue) 
       std::cout << uvalue << std::endl; 
      else 
       std::cout << "Unable to get an integer from this" << std::endl; 
     } 
     else 
      std::cout << value << std::endl; 
    } 
} 
+0

Я считал istringstream (поскольку он «более корректен»), но я решил, что, поскольку у него только есть цифры, это быстрее и проще использовать atoi. Если у него больше цифр, тогда это лучший ответ. Кроме того, он, похоже, заботится только о значениях в 32-битном диапазоне, поэтому внутренний 'iss' можно удалить. –

0

В качестве альтернативы использованию std::getline(), вы могли бы назвать std::ios::clear(). Рассмотрим этот отрывок из вашего previous question

fin >> InputNum; 

Вы можете заменить этот код с этим:

fin >> InputNum; 
    if(!fin) 
     fin.clear();