0

我想读取格式如下的文件中的数据:

Point1, [3, 4]

我正在使用分隔符 '[' ']' 和 ',' 并将它们替换为 ' ' (空格)。我的代码现在很好并且可以工作。但问题是,如果Point1, [3, 4]出现一次,我希望它是唯一的,如果文本文件中存在相同的数据,我希望它不会再次出现。

这是我所拥有的:

string line, name;
char filename[50];
int x,y;

cout << "Please enter filename : ";
cin >> filename;

ifstream myfile(filename);
if (myfile.is_open()) {
    while ( myfile.good() ) {
        getline(myfile, line);

        for (unsigned int i = 0; i < line.size(); ++i) {
            if (line[i] == '[' || line[i] == ']' || line[i] == ',') {
                line[i] = ' ';
            }
            istringstream in(line);
            in >> name >> x >> y;                                  
        }
        cout <<name <<endl;

        if (name=="Point") {
            p.push_back(Point(x,y));         
        }                          
        count++;
    }    
    myfile.close();
    cout << count;
}
else cout<< "Unable to open file";

我该怎么做呢?我试着在之后添加这个if(name=="Point")

for (int j=0; j<p.size(); j++) {
    if(p.getX != x && p.getY) != y) {
        p.push_back(Point(x,y))
    }
}

...但这不能正常工作,因为数据没有存储到向量中。

任何人都可以帮忙吗?

4

2 回答 2

4

您可以将数据vectors存储到sets. 一个集合只包含唯一的值,所以你不必检查你的唯一性Pointsset将管理它。

而不是定义vector<Point>,你必须定义set<Point>,而不是使用p.push_back将点添加到你的向量中,你必须使用p.insert如果它是一个set

您可以在此处set查看文档。

于 2012-11-11T11:38:15.043 回答
0

假设您想将数据存储在 a 中,std::vector<Point>您只需检查是否不存在对应的点。假设定义了一个相等运算符,就这么简单:

if (p.end() == std::find(p.begin(), p.end(), Point(x, y))) {
    p.push_back(Point(x, y));
}

如果您Point的类型没有相等运算符并且不应该得到一个,您可以使用一个函数对象find_if()来代替,例如:

if (p.end() == std::find_if(p.begin(), p.end(),
                      [=](Point const& v) { return x == v.x && y == v.y; })) {
    ...

您应该将循环与其他操作分开:您建议检查该点是否已存在的循环基本上就是std::find()在每次迭代中插入一个新点!您首先要遍历所有现有点,看看它是否存在于任何地方。只有在没有的情况下,您才会插入一个新点。

请注意,您在替换字符串中的字符时犯了类似的错误:您在检查每个字符后尝试解码字符串。这不是一个语义问题,而是一个主要的性能问题。您应该在循环中替换字符,并且该循环之后您应该只解码字符串一次。当然,在解码字符串时,您需要检查格式是否正确,因为始终需要确定输入操作是否成功。也就是说,在你的循环替换你想要的字符之后:

std::istringstream in(line);
if (in >> name >> x >> y) {
    // now process the data
}

...或者,如果你和我一样,不喜欢命名只是暂时存在的东西:

if (std::istringstream(line) >> std::ws >> name >> x >> y) {

另请注意:检查流good()通常是错误的事情,因为流可以处于非常好的状态,除非它在某个时候看到了 EOF,因此设置了std::ios_base::eofbit. 更重要的是,您需要在输入操作之后进行检查,而不是之前!也就是说,您的第一个循环应该以这样的方式开始:

while (std::getline(myFile, line)) {
    ...
于 2012-11-11T12:21:30.760 回答