我想从两个文件中读取,一个包含三列中的浮点数,另一个包含两列中的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中读取它们?
答案 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)
参数