2010-05-02 155 views
0

我正在寫一個練習的程序,它將讀取文件中的數據並將其格式化爲可讀。到目前爲止,我有一些代碼會將頭部與其下的數據分開。那就是:爲什麼不執行for循環?

int main() { 
    ifstream in("records.txt"); 
    ofstream out("formatted_records.txt"); 
    vector<string> temp; 
    vector<string> headers; 
    for (int i = 0; getline(in,temp[i]); ++i) { 
     static int k = -1; 
     if (str_isalpha(temp[i])) { 
      headers[++k] = temp[i]; 
      temp.erase(temp.begin() + i); 
     } 
     else { 
      temp[i] += "," + headers[k]; 
     } 
    } 
} 

str_isalpha()只是適用isalpha()在一個字符串中的每個字符的功能)現在,for循環在這個程序不執行,我想不通爲什麼。有人知道嗎?

編輯:至於建議,我把它改成

string line; 
for (int i = 0; getline(in,line); ++i) { 
    temp.push_back(line); 

不過跳過for循環乾脆。

+0

是getline參數中的逗號嗎? – Holograham 2010-05-02 01:22:13

+0

是的,這就是參數如何在函數中分離,不是嗎? – Maulrus 2010-05-02 01:34:10

回答

4

如果在確保您正在讀入有效的字符串引用之後循環仍然不運行,那麼您應該檢查您正在讀取的流是否有效。例如,如果該文件不存在或者您沒有權限讀取該文件流,該流將無效。當流無效時,getline將不會讀取任何內容。它的返回值是相同的流,當轉換爲bool時,它的計算結果爲false。在繼續之前檢查流的狀態。

ifstream in("records.txt"); 
if (!in.is_open()) { 
    std::cerr << "Uh-oh.\n"; 
    return EXIT_FAILURE; 
} 
+0

謝謝,這原來是問題所在。 – Maulrus 2010-05-02 01:46:32

5

vector<string> temp;作出載體。當您嘗試讀入temp[0]時,這是未定義的行爲。你應該先通過getline的第二個參數一個單獨的string變量,比如string foo;之前的循環,然後temp.push_back(foo);作爲循環體中的第一條指令。