C ++:istringstream循环两次

时间:2013-10-30 18:07:00

标签: c++ fileparsing istringstream

我目前正在开发一个模拟进程调度程序。代码读取虚假进程的文本文件,我需要能够解析整个文件。文本文件的格式如下所示。

Pid     Bst     Arr     Pri     Dline   I/O
1       1       850     61      852     3
2       15      3980    82      3998    2
3       83      8095    51      8179    0
4       96      7262    66      7365    0
5       100     6529    1       6630    0
6       58      9068    24      9132    0
7       9       5148    35      5166    4
8       -8      5924    3       5925    0
9       100     -1      34      101     0
10      72      1918    43      -5      0

为了做到这一点,在寻找关于最佳方法的一些建议后,我决定使用istringstream。代码如下。

int parseProcessFile(String filename){
    std::ifstream infile(filename);

    std::string line;
    while (std::getline(infile, line)){
        std::istringstream iss(line);
        int pid, bst, arr, pri, dline, io;
        if (!(infile >> pid >> bst >> arr >> pri >> dline >> io) || (pid < 0 || bst < 0 || arr < 0 || pri < 0 || dline < 0 || io < 0)) { 
            //do nothing, as this line won't read in appropriately
        } // error
        printf("%d | %d | %d | %d | %d \n", pid, bst, arr, pri, dline, io);
        // save process details
    }
    return 1;
}

如果只检查正确的输入(没有非整数,不小于0),那么很长

出于某种原因,当跑步时,它完全循环两次,打印出正确的线条。任何人都可以向我解释为什么会这样吗?

2 个答案:

答案 0 :(得分:0)

if (!(infile >> pid >> bst >> arr >> pri >> dline >> io) ...)

将从文件中读取(在您从文件中读取之后)。你的意思是

if (!(iss>> pid >> bst >> arr >> pri >> dline >> io) ...)

将使用getline解析您刚读过的行。

答案 1 :(得分:0)

您的代码中存在一些问题。以下是我认为您打算写的内容:

int parseProcessFile(string filename){
    std::ifstream infile(filename.c_str());

    std::string line;
    while (std::getline(infile, line)){
        std::istringstream iss(line);
        int pid, bst, arr, pri, dline, io;
        if (!(iss >> pid >> bst >> arr >> pri >> dline >> io) || (pid < 0 || bst < 0 || arr < 0 || pri < 0 || dline < 0 || io < 0)) { 
            //do nothing, as this line won't read in appropriately
            continue;
        } // error
        printf("%d | %d | %d | %d | %d | %d \n", pid, bst, arr, pri, dline, io);
        // save process details
    }
    return 1;
}

首先,除非您打算写String(使用大写'S'),否则您使用的是std::string,并且您需要将const char *传递给ifstream的构造函数

其次,您打算键入iss而不是infile。正如Zac所说,你正在解析错误的事情。

最后,如果你真的不想对无效行做任何事情,你应该将printf放在else中,或者使用continue跳过你的检查中的无效循环迭代

希望这有帮助! :)