C++ C++;:istringstream循环两次

C++ C++;:istringstream循环两次,c++,fileparsing,istringstream,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 6

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

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;
}
int parseProcessFile(字符串文件名){
std::ifstream infle(文件名);
std::字符串行;
while(std::getline(infle,line)){
标准::istringstream iss(线);
内部pid、bst、arr、pri、dline、io;
如果(!(填充>>pid>>bst>>arr>>pri>>dline>>io)| |(pid<0 | | bst<0 | | arr<0 | | pri<0 | | dline<0 | | io<0)){
//不要做任何事情,因为这行内容无法正确读入
}//错误
printf(“%d |%d |%d |%d |%d\n”、pid、bst、arr、pri、dline、io);
//保存流程详细信息
}
返回1;
}
长if只检查输入是否正确(无非整数,不小于0)

由于某种原因,当运行时,它会完全循环两次,打印出所有正确的行。有人能解释一下为什么会发生这种情况吗

if (!(infile >> pid >> bst >> arr >> pri >> dline >> io) ...)
将从文件中读取(在您已经从文件中读取之后)。你想做的是

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

这将解析您刚才用
getline

读取的行。您的代码中有一些问题。以下是我认为你想写的:

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;
}
int parseProcessFile(字符串文件名){
std::ifstream infle(filename.c_str());
std::字符串行;
while(std::getline(infle,line)){
标准::istringstream iss(线);
内部pid、bst、arr、pri、dline、io;
如果(!(iss>>pid>>bst>>arr>>pri>>dline>>io)| |(pid<0 | | bst<0 | | arr<0 | | pri<0 | | dline<0 | | io<0)){
//不要做任何事情,因为这行内容无法正确读入
继续;
}//错误
printf(“%d |%d |%d |%d |%d |%d\n”、pid、bst、arr、pri、dline、io);
//保存流程详细信息
}
返回1;
}
首先,除非您打算编写
String
(带大写字母'S'),否则您使用的是
std::String
,需要将
const char*
传递给ifstream的构造函数

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

最后,如果您确实不想在无效行上执行任何操作,则应将printf放入
else
,或使用
continue
跳过无效检查中的循环迭代


希望这有帮助!:)

如果您对其他所有内容都使用流,为什么突然切换到
printf
进行输出?是
!(infle>>
打字错误?你为什么不阅读你制作的stringstream中的内容?