2012-11-10 135 views
0

我有一个文本文件中的文本文件,内容是阅读带分隔符

Point1, [5, 6] 
Line2, [1, 2, 3], [-5, 55, 33] 
Point2, [5, 3, 1] 
Line1, [1, 2], [5, 7] 

我会做comparisions,像第一个变量(点1,2号线,点2,一号线)

如果是point1,它将被存储到点1阵列中,5被设置为x,并且y被设置为6.

如何将分隔符设置为逗号以及'['和']'。我只需要变量Point1,5和6来相应地存储它们。

回答

1

我会用最简单的方法解决这个问题 - 使用getline读取文件,然后用空格替换所有出现的,[]。然后您可以使用<sstream>中的std::istringstream来读取所有输入。你也可以使用正则表达式(如果你使用boost或C++ - 11),但我相信我建议应该完成这项工作。

编辑:这里是一个例子如何做我建议。我只会告诉你如何输入点,以处理线,你将不得不添加一个基于名称的if语句。你

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

int main() { 
    string line; 

    while (getline(cin, line)) { 
    for (unsigned i = 0; i < line.size(); ++i) { 
     if (line[i] == '[' || line[i] == ']' || line[i] == ',') { 
     line[i] = ' '; 
     } 
    } 
    istringstream in(line); 

    string name; 
    double x,y; 
    in >> name >> x >> y; // Point1 <x> <y> 
    ... do something with the point... 
    } 

    return 0; 
} 

也可以使用replace_if<algorithm>更换符号,但我还是决定它会更容易让你了解这个解决方案。

+0

我可以参考的任何网站?需要一些例子 –

+0

我会给我的回答添加一个例子 –

+0

'code' \t ifstream myfile(“messy.txt”); \t如果(myfile.is_open()) \t { \t \t而(myfile.good()) \t \t { \t \t \t串线; \t \t \t而(函数getline(CIN,线)) \t \t \t { \t \t \t \t为(无符号I = 0; I <线。尺寸(); ++ⅰ) \t \t \t \t { \t \t \t \t \t如果(行[I] == '[' ||线[I] == ']' ||线[I] == '') \t \t \t \t \t { \t \t \t \t \t线[I] ='“; \t \t \t} \t \t \t \t \t \t \t \t \t \t istringstream中(线); \t \t \t \t \t字符串名称; \t \t \t \t \t double x,y; \t \t \t \t in >> name >> x >> y; \t \t \t \t \t cout << name; \t \t \t \t \t} \t \t \t} \t \t \t返回0; \t \t} \t \t myfile.close(); \t} \t else cout <<“无法打开文件”; \t return 0; –

1

您可以使用json-cpp库。它有类似的语法:

{ 
"Point1" : [5, 6], 
"Line2": { 
    "param1" : [1, 2, 3], 
    "param2" : [-5, 55, 33] 
    }, 
    "Point2" : [5, 3, 1], 
    "Line1" : { 
    "param1" : [1, 2], 
    "param2" : [5, 7] 
    } 
} 
+0

http://jsoncpp.sourceforge.net/ – DemiDroL

+0

我目前正在处理C++。使用昆西2005年 –