【问题标题】:C++ : istringstream looping twiceC ++:istringstream循环两次
【发布时间】:2013-10-30 18:07:00
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您使用流进行其他所有操作,为什么突然切换到printf 进行输出?
  • !(infile &gt;&gt; 是错字吗?你为什么不从你制作的字符串流中读取那些?

标签: c++ fileparsing istringstream


【解决方案1】:
if (!(infile >> pid >> bst >> arr >> pri >> dline >> io) ...)

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

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

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

【讨论】:

    【解决方案2】:

    您的代码中存在一些问题。这就是我认为您要写的内容:

    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 在您检查无效时跳过该循环迭代。

    希望这会有所帮助! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2021-01-26
      • 2011-06-01
      相关资源
      最近更新 更多