2013-06-01 58 views
0

我試圖避免在我的代碼中使用istream的eof,它假設處理文本文件,有關原因的更多信息,請參閱here避免在C++中使用isofream的eof

下面的代碼嘗試逐行讀取,但是每一步代碼讀取兩行而不是一行。

顯然getline函數執行兩次,數據在被strtok_s函數處理之前首先被讀取到buf。

如果我要忽略內部getline指令,我怎樣才能將數據寫入buf[]進行處理?

while (getline(fin, line)) 
//while(!fin.eof()) 
{ 
    // read an entire line into memory 
    char buf[MAX_CHARS_PER_LINE]; 
    fin.getline(buf, MAX_CHARS_PER_LINE); 

    // parse the line into blank-delimited tokens 
    int n = 0; // a for-loop index 
    int s = 0; 
    // array to store memory addresses of the tokens in buf 
    const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0 
    char *next_token; 
    // parse the line 
    token[0] = strtok_s(buf, DELIMITER, &next_token); // first token 
    if (token[0]) // zero if line is blank 
    { 
     for (n = 1; n < MAX_TOKENS_PER_LINE; n++) 
     { 
      token[n] = strtok_s(0, DELIMITER, &next_token); 

      if (!token[n]) break; // no more tokens 
     } 
    } 

    // process (print) the tokens 
    for (int i = 0; i < n; i++) // n = #of tokens 
     cout << "Token[" << i << "] = " << token[i] << endl; 
    cout << endl; 
} 

fin.clear(); 
fin.close(); 
+0

'DELIMITER'的值是什麼? – hmjd

+0

分隔符是「|」。我不認爲分隔符與此有任何關係。 – Hawk

+0

這段代碼有兩個調用'getline'的函數,所以它在每次循環中讀取兩行。 –

回答

2

您不需要第二次調用getline:您已經擁有了可供您使用的內容,它已在行變量中。所有你需要的是讓它的內容出去進一步的標記。這並不困難:你需要的只是調用變量c_str,如下所示:

char *buf = line.c_str(); 
+0

我想你的意思是:'const char * buf = line.c_str();'。 在'strtok_s'函數中導致錯誤,該函數將第一個參數作爲'char *'。如果是這樣;如何將buf從const char *轉換爲char *以達到'strtok_s'的目的? – Hawk

+0

或者我可以簡單地使用:'char * buf = strdup(line.c_str());'? – Hawk