首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用argv和redirection从输入文件读取输入文件

如何使用argv和redirection从输入文件读取输入文件
EN

Stack Overflow用户
提问于 2010-10-19 11:52:15
回答 5查看 2.7K关注 0票数 3

我的程序需要接受以下三种输入命令:

代码语言:javascript
复制
./Myprogram input.txt
./Myprogram < input.txt
./Myprogram

我正在考虑使用argc检查参数的数量,以解决前两种情况(因为重定向不算参数)。但是,我坚持使用最后一种情况,它只是等待用户输入。

我想知道是否有一种方法可以判断shell命令中是否存在重定向?

对于更复杂的场景,比如混合使用重定向和argv表单(见下文)。有没有办法做到这一点,或者这只是一个接受用户命令的糟糕的设计?

代码语言:javascript
复制
./Myprogram input1.txt input2.txt input3.txt
./Myprogram input1.txt < input2.txt input3.txt
./Myprogram

任何帮助都将不胜感激!

Z.Zen

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-19 11:57:57

重定向永远不会被您的程序视为参数。所以在:

代码语言:javascript
复制
./Myprogram input.txt
./Myprogram < input.txt
./Myprogram

第二种和第三种形式是相同的。至于你的第二种可能性:

代码语言:javascript
复制
./Myprogram input1.txt input2.txt input3.txt
./Myprogram input1.txt < input2.txt input3.txt
./Myprogram

第二行相当于:

代码语言:javascript
复制
./Myprogram input1.txt input3.txt < input2.txt

而且它也无法与:

代码语言:javascript
复制
./Myprogram input1.txt input3.txt

(唯一不同的是标准输入的实际来源)。

一些程序处理来自标准输入和在命令行上指定的文件的混合输入的典型方式是接受"-"作为特殊的文件名,这意味着“在参数列表中的这个位置使用标准输入作为输入文件”。如果参数列表为空,许多这样的程序将默认处理"-"的单例列表。

票数 6
EN

Stack Overflow用户

发布于 2010-10-19 12:04:24

基本算法是:

代码语言:javascript
复制
if (there are no arguments left after parsing options)
    call_function(stdin);
else
{
    foreach remaining argument
    {
        FILE *fp;
        if (strcmp(argument, "-") == 0)
            call_function(stdin);
        else if ((fp = fopen(argument, "r")) == 0)
            ...error handling...
        else
        {
            call_function(fp);
            fclose(fp);
        }
    }
}

您也可以将文件名传递给'call_function()‘,有时我会使用指定的输出文件流来编写代码。该函数('call_function()')处理一个文件-读取到文件的末尾。它不会关闭该文件;它被赋予了一个打开的文件,并且不应该关闭它。

当然,第一个“if”处理I/O重定向的情况。

多年来,我写了一个函数来处理这个循环。每当我需要用这种“UNIX过滤器”习惯用法编写命令时,它就简化了我的生活--这是相当常见的。再加上一个标准化的错误报告包,它大大简化了工作。将其作为函数还允许我在其上使用变体,例如在文件被覆盖之前创建文件备份的变体,或者在函数成功完成时安全地覆盖文件的变体。

票数 4
EN

Stack Overflow用户

发布于 2010-10-19 12:04:01

@R..对于通常的情况是正确的。

如果您希望在情况#3而不是#2中具有交互行为,除了让终端按行缓冲用户的输入之外,还可以使用isatty (特别是isatty(0))来确定另一端是否有人。

这不是标准的C语言,但也不是终端或shell的概念!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3965212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档