Предварительный указатель файла, чтобы пропустить номер в файле - PullRequest
0 голосов
/ 13 сентября 2011

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

12
8764
2147483648
2
-1

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

Ответы [ 3 ]

6 голосов
/ 13 сентября 2011

Использовать std :: getline вместо оператора >> (std :: 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;
}

Причина, по которой вы испытываете такое поведение, заключается в том, что когда std :: 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 голосов
/ 13 сентября 2011

В качестве альтернативы использованию std::getline(), вы можете позвонить std::ios::clear().Посмотрите на этот отрывок из вашего предыдущего вопроса

    fin >> InputNum;

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

    fin >> InputNum;
    if(!fin)
        fin.clear();
0 голосов
/ 13 сентября 2011

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

#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;
    }
}
...