2013-10-30 47 views
0

我目前正在模擬進程調度器。該代碼讀取假過程的文本文件,並且我需要能夠解析該文件。文本文件的格式如下所示。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; 
} 

長,如果只是簡單地檢查了正確的輸入(沒有非整數,無外乎0)

出於某種原因,跑的時候,它是通過循環徹底兩次,打印出的一切,是一條正確的路線。誰能向我解釋爲什麼會發生這種情況?

+0

如果您使用的是其他所有流,爲什麼突然切換到'printf'輸出? –

+3

'!(infile >>'是一個錯字嗎?你爲什麼不讀取你所創建的字串流中的那些? – bstamour

回答

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。正如Zac所說,你解析錯誤的東西。

最後,如果您確實不想在無效行上做任何事情,則應該將printf放在else中,或者使用continue在檢查無效的情況下跳過該循環迭代。

希望這會有所幫助! :)