现在我有个问题要问每个人.我已经盯着这个看了几天了,我一直在摆弄,但即使是这样,我也会犯很多错误.
我想要做的是将下面的程序进行修改,以便它使用一个可选的命令行参数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 */发布于 2009-10-29 08:14:54
C程序通过main()的两个参数获取命令行参数,传统上称为argc和argv (分别用于参数计数和参数向量)。
参数不是“命名”任何东西,它们只是字符串。
您的解决方案可能如下所示:
#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;行之后。
发布于 2009-10-29 08:21:31
如果不能重新分配STDIN_FILENO,这听起来像是freopen()的任务
freopen(argv[1], "r", stdin);https://stackoverflow.com/questions/1642211
复制相似问题