我目前正在开发一个模拟进程调度程序。代码读取虚假进程的文本文件,我需要能够解析整个文件。文本文件的格式如下所示。
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),那么很长
出于某种原因,当跑步时,它完全循环两次,打印出正确的线条。任何人都可以向我解释为什么会这样吗?
答案 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
跳过你的检查中的无效循环迭代
希望这有帮助! :)