高级文件指针可跳过文件中的数字

时间:2011-09-13 18:02:52

标签: c++ file file-pointer

我想知道我是否可以在文本文件中跳转位置。 假设我有这个文件。

12
8764
2147483648
2
-1

每当我尝试读取第三个数字时,它都不会读取,因为它大于32位int的最大数字。所以每当我达到第三个数字时,它就会一遍又一遍地读取第二个数字。我怎样才能跳到第4个号码?

3 个答案:

答案 0 :(得分:6)

使用std :: getline而不是operator>>(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”标志,这意味着出现了问题。只要该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
}

答案 1 :(得分: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;
    }
}

答案 2 :(得分:0)

作为使用std::getline()的替代方法,您可以致电std::ios::clear()。请考虑一下previous question

中的摘录
    fin >> InputNum;

您可以用以下代码替换该代码:

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