c ++移动到file.txt中的下一个元素

时间:2014-06-30 21:02:18

标签: c++ file next

我有一个愚蠢的问题。 我有一个.txt文件。一旦打开,我需要只采取数字和跳过单词。 有没有方法可以检查下一个元素是否是一个单词?

因为我的文件是这样的:字1 2字1 2 3 4 5 6 ...

int n,e;
string s;
ifstream myfile("input.txt");

因此我认为这是一种愚蠢的方法,可以使用字符串来避免问题,并将内容放入字符串然后取数字,就像这样:

myfile >> s;
myfile >> n;
myfile >> e;

4 个答案:

答案 0 :(得分:0)

您可以将所有数据作为字符串获取,并尝试将数据转换为try {} catch () { }块中的整数。如果数据是真实的整数,则在try部分执行操作,否则如果代码转到catch并且不在catch中执行任何操作。

答案 1 :(得分:0)

当您正在读取文件时,所有数据都被视为字符串。您必须检查字符串是否为数字。这是一种将字符串转换为整数的方法(如果这是一个整数):atoi() function 但要小心,你必须传递一个c字符串。

答案 2 :(得分:0)

哎呀它已经解决了。值得一提的是,还有可能:

  • 从使用运算符>

  • 之前读取流中的单个字符和pushback()(如果它们是数字)
  • 或peek()流中的下一个字符而不读取它以决定是忽略它还是使用运算符>>

请注意' - '这不是一个数字,但可能是一个整数的标志。

这是一个小例子:

int c, n, sign=1; 
ifstream ifs("test.txt", std::ifstream::in);

while (ifs.good() && (c=ifs.peek())!=EOF ) {
    if (isdigit(c)) {
        ifs >> n;
        n *= sign; 
        sign = 1; 
        cout << n << endl; 
    }
    else {
        c=ifs.get();
        if (c == '-')
            sign = -1;
        else sign = 1;
    }
}
ifs.close(); 

这不是最高效的方法,但它的优点是只能从流中读取,没有中间字符串和内存管理。

答案 3 :(得分:0)

您可以执行以下操作

int num = 0;
while(myfile >> num || !myfile.eof()) {
    if(myfile.fail()) { // Number input failed, skip the word
        myfile.clear();
        string dummy;
        myfile >> dummy;
        continue;
    }
    cout << num << endl; // Do whatever necessary with the next number read
}

查看complete, working sample here