gpt4 book ai didi

c - 有没有来自标准输入的东西?

转载 作者:行者123 更新时间:2023-12-02 21:36:44 24 4
gpt4 key购买 nike

可以编写一个代码来识别文件是否被传递,如下所示:

program.out < file.dat

我搜索这个问题的答案,因为我想编写代码来做这样的事情:

int main (int argc, char *argv[])
{
char filename[50];

if ( argc > 1 )
{
strcpy (filename, argv[1]);
}

else if ( SOMETHING )
{
/* copy the stdin into fin (?) */
}

FILE *fin;

fin = fopen (filename, "r");

/* ... */

fclose(fin);

}

return 0;
}

其中SOMETHING如果文件通过 < 传递,则计算结果为 1 ,否则为 0。

如果可能的话,我正在寻找一种在标准 C 中工作的解决方案。

最佳答案

我们无法在 ISO C 中检测到这一点(也就是说,不诉诸平台扩展,例如在 POSIX 上使用 fileno 获取文件描述符,然后通过使用 fstat 获取属性来对其运行一些测试,等等。)

stdin如果流连接到交互式设备,则 ISO C 要求流进行行缓冲。然而,这对我们没有帮助,因为没有可移植的函数来查询 FILE * 的缓冲模式。 :只有“setter”,没有“getters”。 GNU C 库有 __flbf (FILE *stream)它报告流是否是行缓冲的,但它是一个明显的扩展,在 <stdio_ext.h> 中声明。 header 。

如果您的程序必须使用文件,而不是来自交互式设备的标准输入,那么一个好的解决方案是使程序的参数成为强制性的。使其需要文件名参数并始终打开该文件。那么您确定您拥有该文件。

您还可以将参数设为可选,如果缺少该参数,则打开默认文件,忽略 stdin .

您还可以使用freopen制作stdin指向一个文件。然后是与 stdin 一起使用的代码隐式将从该文件获取输入:

伪代码:

name = "some default"

if we have an argument
name = that argument

if (freopen(name, mode, stdin) == 0)
handle error
else
stdin is now a file; process it

如果您确实必须支持program < file情况,同时标记program情况(交互式输入)无效,您需要上述特定于平台的技巧。

关于c - 有没有来自标准输入的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21197562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com