2011-02-15 51 views
0

我需要從外部文件讀取數字並將它們存儲在整數的向量中。我現在可以做到這一點,這要感謝Howard Hinnant和wilhelmtell,他耐心地幫助我們弄清楚爲什麼我的編碼在昨天不工作。C++:使用getline()從外部文件讀取後續問題。如何獲取文件數據的子集?

我一直在試圖弄清楚如何在代碼中加入一個附加功能,但是我已經用盡了我對流的瞭解,並希望得到一些建議。

我想能夠處理包含多組數據的文件。是否有可能從文件中只提取某些數據到矢量中?我想結束包含來自文件不同部分的數據的幾個向量。我在網上搜索,但沒有看到任何提及。

下面是代碼以及我想從中獲取數據的文件示例(我們稱之爲「測試」)。


編輯:我編輯基於CashCow的建議代碼。我現在可以從數據文件中取出一個塊。但我不知道如何獲得我想要的塊。如果我按原樣運行代碼,則會得到一個包含元素2,5,8的向量(這不是我想要的)。要(在我所做的例子4,5,6)得到vectorTwo,我想圍繞while語句添加此:

if(line == "vectorTwo") 
{ 
     // The while statement and its contents 
} 

它沒有工作。我沒有得到任何運行代碼的結果(雖然它編譯)。任何人都可以看到問題是什麼?我想我可以使用這個語句來搜索我需要的數據塊的標題。


//這裏是文件

vectorOne //用於數據的子集的標識符用於一個向量

'1' '2' '3'

的例子中的內容vectorTwo//我如何得到這一個矢量?或者任何其他的矢量?

'4' '5' '6'

vectorThree //標識符數據的子集用於另一矢量

'7' '8' '9'

//代碼: '\''字符是行分隔符。一切都被忽略到第一個'然後一切,直到下一個'是一個數字的一​​部分。這一直持續到邏輯失敗(文件結束)。我怎樣才能讓它停止在數據塊的末尾呢?

#include <fstream> 
#include <iostream> 
#include <vector> 
#include <string> 
#include <sstream> 
#include <iterator> 

int main() 
{ 
    std::string line; 
std::string block;   // Edited, from CashCow 
    const std::string fileName = "test.dat"; 

    std::ifstream theStream(fileName.c_str()); 

    if(! theStream) 
      std::cerr << "Error opening file test.dat\n"; 

    std::vector<int> numbers; // This code is written for one vector only. There would be three vectors for the example file I provided above; one for the vectorOne data in the file, and so on. 

    while (true) 
    { 
     // get first ' 
     std::getline(theStream, line, '\''); 
     // read until second ' 
     std::getline(theStream, line, '\''); 
     std::istringstream myStream(line); 

     std::getline(theStream, block, '\n'); // Edited, from CashCow 
     std::istringstream blockstream(block); // Edited, from CashCow 
     std::getline(blockstream, line, '\''); // Edited, from CashCow 


     int i; 
     myStream >> i; 
     if (myStream.fail()) 
      break; 
     numbers.push_back(i); 
    } 
    std::copy(numbers.begin(), numbers.end(), 
       std::ostream_iterator<int>(std::cout, "\n")); 
} 

回答

0

當你到達一個塊的開始時,只要讀到該行的最後一個字符串,然後解析該字符串。

std::getline(theStream, block, '\n'); 
std::istringstream blockStream(block); 
std::getline(blockStream, line, '\''); // etc 
+0

謝謝。我根據你的建議編輯了上面的代碼,現在我可以得到一段代碼。只是一個問題。如果我想獲得vectorTwo的向量(在我做的例子中爲4,5,6),我將如何獲得這些值?現在我正在隨機。我嘗試使用線== vectorTwo,但沒有奏效。 – user616199 2011-02-15 16:09:01

相關問題