从stdio读取两个文件

时间:2015-03-05 20:29:00

标签: c++ input stdin

我想从两个文件中读取,一个包含三列中的浮点数,另一个包含两列中的int。我有以下代码从stdin读取:

int main() {
    while (scanf("%lf %lf %lf\n",&x,&y,&z) != EOF) {
        // do stuff
    }

    puts("foo");

    int a,b;
    while (scanf("%d %d\n",&a,&b) != EOF) {
        puts("bar");
    }
}

然后我用cat ortho.dat pairs.dat | ./angles调用程序,ortho.dat和pairs.dat是两个文件。但是输出只是foo,表示永远不会读取第二个文件,大概是因为它读取EOF并立即终止第二个循环。这是对的吗?

我怎么能读取这两个文件,而不是在程序中实际打开它们,只是从stdin中读取它们?

3 个答案:

答案 0 :(得分:3)

问题:

  

我怎么能读取这两个文件,而不是在程序中实际打开它们,只是从stdin读取它们?

一个解决方案:

在两个文件的内容之间插入虚拟,无效的内容。 用它来分隔第一个文件和第二个文件中的数据。

文件“哑”的内容:

===Separator===

将您的代码更改为:

int main() {
    while (scanf("%lf %lf %lf\n",&x,&y,&z) == 3) {
        // do stuff
    }

    // Skip the line that contains the separator.
    scanf("%*[^\n]");

    puts("foo");

    int a,b;
    while (scanf("%d %d\n",&a,&b) == 2) {
        puts("bar");
    }
}

更改调用:

cat ortho.dat dummy pairs.dat | ./angles

<强>更新

C ++版本:

int main() {
    while ( std::cin >> x >> y >> z ) {
        // do stuff
    }

    // Skip the line that contains the separator.
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    puts("foo");

    int a,b;
    while ( std::cin >> a >> b ) {
        puts("bar");
    }
}

答案 1 :(得分:2)

当您执行“cat F1 F2 | program”时,cat将连接文件,程序将接收单个连续的数据流。

从程序的角度来看,无法找到一个文件的结束位置,然后第二个开始,除非将一些标记插入到文件中。

例如,您可以在第一个文件后面插入一行:     FILE1ENDS 然后,如果在文件本身中永远找不到这样的行,则可以使用它来终止第一个循环。

作为替代传递文件的名称作为程序的参数,并自己打开/读取/关闭它们。

答案 2 :(得分:2)

你不能可靠地做到这一点。阅读  fscanf(3)(它处理每个类似空格的字符,包括换行符)。顺便说一下,你最好测试scanf返回实际的数量(例如第一种情况为3,第二种情况为2)。

但是,您可能对输入有更多限制。也许三个双打和两个整数总是在同一条线上,例如ortho.dat包含

等行
1.0 2.0 3.0

pairs.dat包含

等行
23 45

然后你可以使用getline(3)(或者fgets)读取每一行并使用sscanf来解析它(并且你将使用它的返回计数来分隔具有3个浮点的行从2行整数)。 %n控件格式可能很方便(它给出当前光标位置)。

但是,我建议传递两个文件名ortho.dat&amp; pairs.dat作为不同的参数(即使用argc的传统argv&amp; main(int argc, char**argv)参数