синтаксический анализ файлов — C ++: 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;
}

long if просто проверяет правильность входных данных (без целых чисел, не меньше 0)

По какой-то причине, когда он запускается, он полностью проходит через два цикла, распечатывая все, что является правильной строкой. Может кто-нибудь объяснить мне, почему это происходит?

0

Решение

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

Это будет читать из файла (после того, как вы уже прочитали из файла). То, что вы хотели сделать, было

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

Который будет анализировать строку, которую вы только что прочитали getline,

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, Как сказал Зак, вы разбираете не то.

Наконец, если вы действительно не хотите ничего делать с недопустимой строкой, вы должны поместить printf в elseили используйте continue пропустить эту итерацию цикла в вашей проверке на недействительность.

Надеюсь это поможет! 🙂

0

По вопросам рекламы [email protected]