2012-11-12 59 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. 将对象指定给适当的对象集合

您可能想要编写一些其他私有方法来处理数据类型的创建并分配给适当的集合。