我想知道是否可以在文本文件中跳转位置。假设我有这个文件。
12
8764
2147483648
2
-1
每当我尝试读取第三个数字时,它都不会读取,因为它大于 32 位 int 的最大数字。因此,每当我达到第三个数字时,它就会一遍又一遍地读取第二个数字。我怎样才能跳到第四个数字?
我想知道是否可以在文本文件中跳转位置。假设我有这个文件。
12
8764
2147483648
2
-1
每当我尝试读取第三个数字时,它都不会读取,因为它大于 32 位 int 的最大数字。因此,每当我达到第三个数字时,它就会一遍又一遍地读取第二个数字。我怎样才能跳到第四个数字?
使用 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
}
您可以先读取该行,然后如果可以,将该行转换为整数。这是您的文件的示例:
#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;
}
}
作为使用的替代方法std::getline()
,您可以调用std::ios::clear()
. 考虑一下您上一个问题的摘录
fin >> InputNum;
您可以用以下代码替换该代码:
fin >> InputNum;
if(!fin)
fin.clear();