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

long if は単に正しい入力をチェックします (非整数ではなく、0 未満ではありません)。

何らかの理由で、実行すると、完全に 2 回ループし、正しい行がすべて出力されます。なぜこれが起こるのか、誰かが私に説明できますか?

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」で)書くつもりがない限り、を使用しているため、ifstream のコンストラクターにstd::stringa を渡す必要があります。const char *

次に、issの代わりに入力するつもりでしinfileた。ザックが言ったように、あなたは間違ったことを解析しています。

最後に、無効な行で本当に何もしたくない場合は、 printf を に配置するelseか、 を使用continueして、無効性のチェック内でそのループ反復をスキップする必要があります。

お役に立てれば!:)

于 2013-10-30T18:19:19.050 に答える