从仅一行的流中读取点

时间:2019-01-14 21:52:30

标签: c++ file file-read

我有一个文件,该文件首先告诉我下一行将读取多少点。因此,例如我的文件如下所示:

7
a,b c,d e,f g,h, i,j k,l m,n

所以我知道7之后的下一行是7对整数,中间用逗号隔开,每对之间用空格隔开。

我想要什么:要有7个Point元素的向量。

我有一个叫Point的课:

class Point {
public:
    int x;
    int y;
    bool operator==(const Point q){
        return (q.x == this->x && q.y == this->y);
    }
};

因此,当我阅读此文件时,我想使用一个向量V,其中:

V[0].x = a
V[0].y = b
V[1].x = c
V[1].y = d

以此类推。

我可以读取7个整数,但是如何分别读取7对整数中的每一个?我需要这个,因为我要将(a,b)(c,d)...存储在向量中。

不仅是2分。文件的第一行告诉我要存储多少点。

它们不是从标准输入中读取的。

它们是从文件中读取的。

我尝试使用sscanf,但是我认为这仅适用于您有多行包含此信息并且我不想修改我的格式的情况。

这是我到目前为止所拥有的:

void process_file(string filename){
    ifstream thracklefile;
    string line;
    int set_size;
    thracklefile.open(filename);

    getline(thracklefile,line); //store set size.
    set_size = stoi(line);

    //Store points in following line
    points.clear();
    points.resize(set_size);
    getline(thracklefile,line); //store the points.
    }

我不想忽略逗号,每个逗号是我要为每个Point存储的信息的一部分。

1 个答案:

答案 0 :(得分:1)

我认为评论中的大部分讨论都与语义有关。建议您“忽略”逗号,但是不能这样做,因为它们在文件中。也许更好的术语是“丢弃”。因为存在C ++ iostream函数ignore,所以使用“忽略”一词。

有很多方法可以解决这个问题。一种选择是重写流插入/提取运算符:

class Point {
public:
    int x;
    int y;

    // Don't really need this as members are public, but
    // in case you change that in the future....
    friend istream& operator>>(istream& in, Point& p);
    friend ostream& operator<<(ostream& out, const Point& p);
};

istream& operator>>(istream& in, Point& p)
{
    char separator;
    // Try to read <int><char><int>
    in >> p.x >> separator >> p.y;
    // The stream may be in an error state here. That
    // is ok. Let the caller handle that
    // Also note that we discard (ignore) "separator"
    return in;
}
ostream& operator<<(ostream& out, const Point& p)
{
    out << p.x << ',' << p.y;
    return out;
}

int main() {
    int num_points;
    std::cin >> num_points;
    Point p;
    for (int i = 0; i < num_points; i++) {
        if (!(std::cin >> p)) {
            // There was an error
            std::cout << "File format error!" << std::endl;
            break;
        }
        std::cout << p << std::endl;
    }

    return 0;
}

该示例使用cin,但任何流都可以使用,包括ifstream