【问题标题】:Nesting fgets with stdin使用标准输入嵌套 fget
【发布时间】:2016-05-25 23:12:13
【问题描述】:

我正在尝试遍历文件中的每一行和标准输入中的每一行以进行比较。当我将 fgets 嵌套在 while 循环中时,外部循环不会第二次通过。我已经看到,如果内部循环是一个文件,它可以关闭以重置到第一行,但我似乎无法对标准输入做同样的事情。有没有办法在stdin开头重新启动?

while (fgets(fline, sizeof(fline), fileInput)){
    while (fgets(line, sizeof(line), stdin)){
        printf("%s", fline);
        printf("%s", line); 
    }
    fclose(fileInput);
}

如果文件输入包含

a
b
c

而标准输入是

d
e

我要打印出来

a
d
a
e
b
d
b
e
c
d
c
e

【问题讨论】:

  • 如果stdin指向键盘而不是文件,则无法备份,因为无法备份键盘。但是,如果stdin 指向一个文件,则可以在文件中备份,使用类似fseek()

标签: c


【解决方案1】:

内循环完成后,您已到达stdin 的末尾。所以当你进行外循环的下一次迭代时,stdin 中什么都没有了,所以内循环立即结束。

假设stdin 连接到可搜索的流(例如普通文件),您可以通过倒回到内部循环之前的开头来解决此问题。

另一个问题是您在循环内关闭了fileInput。因此,在您读取该文件的第一行后,它正在关闭文件,因此尝试读取下一行时出错。

while (fgets(fline, sizeof(fline), fileInput)){
    rewind(stdin);
    while (fgets(line, sizeof(line), stdin)){
        printf("%s", fline);
        printf("%s", line); 
    }
}
fclose(fileInput);

更通用的解决方案是将stdin 读入一个数组,然后遍历该数组而不是使用fgets 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2017-05-16
    相关资源
    最近更新 更多