2012-11-12 113 views
1

我有一個包含此操縱輸入文件流

Map2D, [3, 2] 
Dot3D, [25, -69, -33], [-2, -41, 58] 
Map3D, [6, 9, -50] 
Map2D, [3, 2] 
Dot3D, [7, -12, 3], [9, 13, 68] 
Map3D, [6, 9, 5] 
Map2D, [3, 2] 
Dot3D, [70, -120, -3], [-29, 1, 268] 
Dot3D, [7, 12, 3], [-9, 13, 68] 
Map3D, [1, 3, 8] 
Dot2D, [5, 7], [3, 8] 

基本上文本文件第一數據的數據文本文件的類名,我得到了4類

Map2D 
Map3D 
Dot2D 
Dot3D 

我試着寫我自己的文件操作器,以便我的程序可以提取上面的數據,併爲4個類中的每一個重載提取操作符>>,然後將其存儲到相關對象中。

我正在考慮使用矢量,地圖,集或列表來存儲。但爲此,我該如何實現我想要做的事情,比如存儲到課程的相關對象中。

我試着用google搜索如何創建自己的文件操縱器,但是如果有人能夠給我看一些示例代碼,並且我可以在測試文件中編譯並執行它,然後觀察輸出結果,那麼這樣做會很好。我想用了iomanip做就>>操作

我,因爲我需要創造這樣

我需要做的是這樣

cout << "Input File Name"; 
cin >> readFile; 

,並執行所有使用機械手超負荷數據讀取&對象創建

我很抱歉造成的一切麻煩。那麼它將逐行讀取記錄,然後創建類和其中的數據。

感謝您的幫助!

+1

我不明白流操縱器是如何適用的。如果你要逐行讀取文件,你可能需要先讀取一個字符串,檢查它是否是Map/DotxD之一,然後調用適當的'operator >>'。 – jrok

+0

@ VladLazarenko您的評論剛剛給我帶來了45個代表。 :P Thx! –

+0

我需要cin來讀取文件,然後相應地分配對象。 – user1777711

回答

3

這是std::cin的示例。它應該工作得很好,fstream。解析你的輸入是非常討厭的。是否可以從輸入中刪除括號(「[」amd「]」)?

#include <iostream> 
#include <string> 
#include <vector> 
#include <sstream> 
#include <algorithm> 
#include <c> 

class Map2D { 
    std::vector<int> values; 
public: 
    friend std::istream& operator>>(std::istream& in, Map2D m) { 
     std::string i; 
     in >> i; 
     std::stringstream ss(i); 
     std::getline(ss, i, '['); 
     std::getline(ss, i, ','); 
     ss >> i; 
     std::cout << i << std::endl; 
     in >> i; 
     ss.str(""); 
     ss << i; 
     i = i.substr(0, i.size()-1); 
     ss >> i; 
     std::cout << i << std::endl;; 
    } 
}; 

int main() { 
    std::string type, file_name; 
    std::cout << "Input File Name"; 
    std::cin >> file_name; 
    std::fstream file(file_name.c_str()); 
    Map2D m; 
    while (std::getline(std::cin, type, ',')) { 
     if(type.find("Map2D") != std::string::npos) { 
      file >> m; 
     } 
    } 
} 
+0

嗨,我可以問,如果我想要求用戶輸入文件名,然後執行cin >>文件名;如何使用您的解決方案 – user1777711

+0

@ user1777711'std :: string file_name;'cin >> file_name;'並使用'std :: fstream文件(file_name.c_str())' – andre

+0

但您的解決方案與我的不同實際上問。 我想實現的是提示用戶的文件名,cin用戶輸入,例如hello.txt,讀取文件內容,然後cout。只是基本的一個,分配給對象將在邏輯上我猜。 – user1777711

2

您可以使用cin來獲取文件名,但是您應該編寫一個可以解析該文件的幫助程序方法。

我的建議是創建一個名爲DataMembers或類似的類。在那個類中,你可以有一個讀入數據成員文件的幫助器方法。該類可以有4個向量用於存儲從文件中讀取的數據。

class DataMembers 
{ 
    private: 
     std::vector<Map2D> _map2Ds; 
     std::vector<Map3D> _map3Ds; 
     .... 
    public: 
     void readDataFile(std::string inFileName); 
     void writeDataFile(std::string outFileName); 
}; 

的readDataFile方法應執行以下操作

  1. 讀取一條線的文件在一個時間
  2. 解析線以確定對象類型來創建(錯誤輸出,如果該類型不是識別)
  3. 確認該行包含指示類型的正確數據
  4. 創建適當類型的對象
  5. 將對象指定給適當的對象集合

您可能想要編寫一些其他私有方法來處理數據類型的創建並分配給適當的集合。