gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:39:27 25 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”,没有“getter”。 GNU C 库有一个 __flbf (FILE *stream)它报告流是否是行缓冲的,但它是一个明显的扩展,在 <stdio_ext.h> 中声明标题。

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

您也可以将参数设为可选,如果缺少参数,则打开一个默认文件,忽略 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/

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