逐行扫描文件中的输入



数据采用格式

int int string

例如

1 2 Hello Hi
2 3 How are you?

如何从中获取单个元素?

如果要使用fscanf执行此操作,则需要使用scan set转换,例如:

int a, b;
char c[256];
fscanf(infile, "%d %d %[^n]", &a, &b, c);

要扫描文件中的所有行,您需要执行以下操作:

while (3 == fscanf(infile, "%d %d %[^n]", &a, &b, c))
    process(a, b, c);

fscanf返回它成功转换的项目数,所以3 ==基本上是说:"只要你成功转换了所有三个项目,就处理它们"。

然而,在C++中,我更喜欢使用iostream,比如:

infile >> a >> b;
std::getline(infile, c);

通常,像这样的文件中的一行表示某种逻辑记录,您可能想将其放入struct中,所以您应该从以下内容开始:

struct foo { 
    int a, b;
    std::string c;
};

那么您可以重载operator>>来读取整个结构:

std::istream &operator>>(std::istream &is, foo &f) { 
    is >> f.a >> f.b;
    std::getline(is, f.c);
    return is;
}

从那里,将结构读取到(例如)向量中可能看起来像这样:

std::vector<foo> vf;
foo temp;
while (infile >> temp)
    vf.push_back(temp);

如果你喜欢(我通常是这样做的),你可以记住vector有一个接受一对迭代器的构造函数,而std::istream_iterator可以很好地完成这项工作,所以你可以做这样的事情:

std::vector<foo> vf {
     std::istream_iterator<foo>(infile),
     std::istream_iterator<foo>() };

并且矢量将根据文件中的数据对其自身进行初始化。

最新更新