0

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

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;
}

长 if 只是检查正确的输入(没有非整数,不少于 0)

出于某种原因,当运行时,它完全循环了两次,打印出所有正确的行。谁能向我解释为什么会这样?

4

2 回答 2

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

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

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

它将解析您刚刚阅读的行getline

于 2013-10-30T18:15:57.847 回答
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,并且您需要将 a 传递const char *给 ifstream 的构造函数。

其次,您的意思是键入iss而不是infile. 正如扎克所说,你在解析错误的东西。

最后,如果您真的不想在无效行上做任何事情,您应该将 printf 放在一个 中else,或者continue在您检查无效时使用它来跳过该循环迭代。

希望这可以帮助!:)

于 2013-10-30T18:19:19.050 回答