2015-03-31 79 views
0

我試圖只使用peek從文件中獲取一個特定行,然後將該行中的值放入數據類型的東西中。嘗試使用C++ Peek從文件中獲取一行代碼

for(int i = 0; i < students.length(); i++) 
{ 
    int q = 0; 
    fin >> name; 
    students[i].n = name; 
    while(fin.peek() != '\n') 
    { 
     students[i].tests.resize(students[i].tests.length()+1); 
     fin >> test; 
     students[i].tests[q] = test; 
     q++; 
    } 

皮克從來沒有真正向我解釋,我將如何改變這種做法,這將有效地調整學生[I] .tests到然而,許多號碼我已經在文件的特定行?在這一點上,它似乎在無限調整。

+0

呃你有沒有讀過['peek'](http://en.cppreference.com/w/cpp/io/basic_istream/peek)是做什麼的?你可能不想用它來閱讀線條。即使你做了,也是不可能的。您可能需要更改整個代碼以使用['getline'](http://en.cppreference.com/w/cpp/io/basic_istream/getline)。如果你沒有得到它,我可以詳細解釋爲什麼你不能偷看一條線,但是這個方法需要改變,所以我不知道它是否有價值。 – luk32 2015-03-31 04:13:54

+0

每行都有一個名稱形式的字符串,然後是與測試分數相對應的不同數量的數字,我如何使用getline將值分配給我創建的結構,該結構有一個字符串作爲名稱和一個測試分數的整數可調整大小的矢量? – imdabes 2015-03-31 04:25:24

回答

0

如果在換行符之前有空白,那麼您的代碼將無法工作,並且在到達文件結束時無限循環。

這是更好的做法是使用一個std::istringstream解析出號碼,push_back他們到testsvector

for (int i = 0; i < students.length(); ++i) 
{ 
    ASSERT_THROW(fin >> students[i].n, "unable to read student name"); 
    std::string line; 
    ASSERT_THROW(getline(fin, line), "unexpected failure or EOF in file"); 
    std::istringstream iss(line); 
    int n; 
    while (iss >> n) 
     students[i].tests.push_back(n); 
    ASSERT_THROW(iss.eof(), "invalid content in '" << line 
       << "' after test scores"); 
} 

ASSERT_THROW同時檢查和投擲的錯誤,例如執行代碼

#define ASSERT_THROW(X, MSG) \ 
    do { \ 
     if (X) break; \ 
     std::ostringstream oss; \ 
     oss << __FILE__ << ':' << __LINE__ << " ASSERT_THROW(" \ 
       << #X << ") " << MSG; \ 
     throw std::runtime_error(oss.str()); \ 
    } while (false)