【问题标题】:c++ moving to next element in a file.txt [duplicate]c ++移动到file.txt中的下一个元素[重复]
【发布时间】:2014-08-21 08:12:47
【问题描述】:

我有一个愚蠢的问题。 我有一个 .txt 文件。打开后,我只需要输入数字并跳过单词。 有什么方法可以检查下一个元素是否是单词?

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

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

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

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

【问题讨论】:

  • 请注意,if(myfile >> n) 语句足以告诉您是否读取了有效数字,否则将评估为 false。

标签: c++ file next


【解决方案1】:

您可以执行以下操作

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢大家的有用回答,我已经了解如何将字符串转换为 int。现在我还有一个问题:有什么方法可以检查文本是否为字符串?我会尽量弄得更清楚。如果我有这样的文本: Data 2 4 10 当我使用时:myfile >> x;我怎么知道“数据”是字符串而不是整数?因为我的问题是我需要跳过单词...再次提前感谢您的回答!
    • @manuello 也许你能找到一些有用的指针here
    • 正如我之前提到的,您读入的所有内容都是字符串。您必须尝试将其转换为 int。如果你不能,你知道你有字符串。如果它确实转换了,那么你就有了一个 int。
    • 您可以使用std::istringstream 和提取运算符。
    【解决方案3】:

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

    【讨论】:

    • 是的,但如果失败,您必须遍历字符串并重试剩余位置(例如,如果输入是“ABC12”)。如果尝试成功,您还需要循环,因为在有效输入之后,可能还有另一个有效输入(例如“1-1”)。
    【解决方案4】:

    糟糕,它已经解决了。但值得一提的是,还有可能:

    • 从流中读取单个字符,如果它们是数字,则在使用运算符之前 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(); 
    

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

    【讨论】:

    • @ πάντα ῥεῖ 我觉得在这段代码上加上 -1 有点苛刻,它只说明了这种方法!
    • 信不信由你,peek 和 pushback 是有用的功能。你不是很有建设性。我更喜欢将 cmets 放在另一个不完美的答案上,以提出改进的方法。
    • '你不是很有建设性'看看我对这个问题的评论。这对于在大约 4-5 行代码中解决 OP 的问题是必要的。显示更多代码作为其他答案,并不能使这个答案变得更好。
    • @ πάντα ῥεῖ 我很想看到你的 4-5 行代码,使用 stol() 来实现相同的结果。我相信在其他解决方案中,您还必须检查数字、减号、双减号。并且只使用流而不需要中间缓冲区是值得一提的不错的方法。
    • 您是否阅读了有关问题的评论?我在哪里说过stol()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2021-04-13
    • 2023-02-01
    • 2011-02-05
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多