gpt4 book ai didi

更改 c 中的程序,因此它需要一个可选的命令行参数 *infile*

转载 作者:行者123 更新时间:2023-12-02 15:42:20 27 4
gpt4 key购买 nike

现在我确实有一个硬件问题要问每个人......我已经盯着这个看了几天,有点修补和玩耍,但即便如此我最终还是遇到了很多错误......

我想做的是对下面的程序进行更改,使其采用可选的命令行参数 infile。如果给出了 infile,则将 infile 复制到标准输出,否则像以前一样将标准输入复制到标准输出。

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

/* $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 */

最佳答案

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

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

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

#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 变量。

如果您确实无法更改该行,无论出于何种原因......我想您可以使用预处理器使符号计算为新变量名称:

#undef  STDIN_FILENO
#define STDIN_FILENO fileno

这当然不是很漂亮,但应该可以。

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

关于更改 c 中的程序,因此它需要一个可选的命令行参数 *infile*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1642211/

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