首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改c #中的程序,因此它采用可选的命令行参数*infile*

更改c #中的程序,因此它采用可选的命令行参数*infile*
EN

Stack Overflow用户
提问于 2009-10-29 08:07:30
回答 2查看 815关注 0票数 2

现在我有个问题要问每个人.我已经盯着这个看了几天了,我一直在摆弄,但即使是这样,我也会犯很多错误.

我想要做的是将下面的程序进行修改,以便它使用一个可选的命令行参数infile。如果给出了infile,那么将infile复制到标准输出,否则将标准输入复制到标准输出。

这方面的诀窍是,对于这两种情况,解决方案都必须使用原始复制循环(第9-11行)。只能插入代码,而不能更改任何现有代码。任何帮助都会很好。谢谢。

代码语言:javascript
复制
/* $begin cpfile */
include "csapp.h"
int main(int argc, char **argv)
{
    int n;
    rio_t rio;
    char buf[MAXLINE];

    Rio_readinitb(&rio, STDIN_FILENO);                  //line 9
    while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) //line 10
        Rio_writen(STDOUT_FILENO, buf, n);              //line 11
        /* $end cpfile */
        exit(0);
        /* $begin cpfile */
    }
/* $end cpfile */
EN

回答 2

Stack Overflow用户

发布于 2009-10-29 08:14:54

C程序通过main()的两个参数获取命令行参数,传统上称为argcargv (分别用于参数计数和参数向量)。

参数不是“命名”任何东西,它们只是字符串。

您的解决方案可能如下所示:

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
    int fileno;
    /* ... your definitions should remain here, too */

    if(argc > 1)
    {
       /* Assume first argument is filename, and open it. */
       fileno = open(argv[1], O_RDONLY);
       if(fileno < 0)
       {
         printf("Unable to open file, aborting\n");
         return 1;
       }
    }
    else
      fileno = STDIN_FILENO;

  /* ... your code goes here ... */
}

然后,您当然需要更改对Rio_readinitb()的调用,以使用fileno变量作为文件描述符。

如果你真的不能改变这句话,不管出于什么原因.我想您可以使用预处理器对新变量名进行符号计算:

代码语言:javascript
复制
#undef  STDIN_FILENO
#define STDIN_FILENO fileno

这当然不是很漂亮,但应该有效。

确保将这些预处理宏放在fileno = STDIN_FILENO;行之后。

票数 5
EN

Stack Overflow用户

发布于 2009-10-29 08:21:31

如果不能重新分配STDIN_FILENO,这听起来像是freopen()的任务

代码语言:javascript
复制
freopen(argv[1], "r", stdin);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1642211

复制
相关文章

相似问题

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