C 命令行参数不起作用
我试图将C 命令行参数不起作用,c,unix,terminal,cat,C,Unix,Terminal,Cat,我试图将File1.txt“>”File2.txt作为终端参数传递给我的程序,以覆盖cat命令。但由于某些原因,该程序无法运行。虽然在上述定义的情况下argc为4,但程序中的条件仍不为真。代码如下: int main(int argc, char *argv[]) { int readbytes,fp; char buf[1024]; if(argc==2) { fp=open(argv[1],O_RDONLY); dup2(0,fp); close(fp);
File1.txt“>”File2.txt
作为终端参数传递给我的程序,以覆盖cat命令。但由于某些原因,该程序无法运行。虽然在上述定义的情况下argc为4,但程序中的条件仍不为真。代码如下:
int main(int argc, char *argv[])
{
int readbytes,fp;
char buf[1024];
if(argc==2)
{
fp=open(argv[1],O_RDONLY);
dup2(0,fp);
close(fp);
readbytes=read(STDIN_FILENO,buf,1024);
write(STDOUT_FILENO,buf,readbytes);
}
if(argc==4)
{
printf("inside4");
fp=open(argv[1],O_RDONLY);
dup2(fp,0);
close(fp);
fp=open(argv[3],O_WRONLY|O_CREAT|O_TRUNC,S_IRWXU);
dup2(fp,1);
close(fp);
readbytes=read(STDIN_FILENO,buf,1024);
//printf("%c",buf);
write(STDOUT_FILENO,buf,readbytes);
}
return 0;
}
我找不到解决这个问题的方法,所以我现在把它交给了专家。这个问题的原因是什么
注意:
由于某种原因,当我将./prog File1.txt>File2.txt发送到程序时,argc==2
条件被选中,但是argc是4。为什么呢
关于这可能是由您运行程序的方式造成的。打字
./myProg foo > bar
将指示大多数Shell使用参数foo
运行myProg
,并将打印到stdout
的内容保存到名为bar
的文件中。要将foo
、
和bar
作为命令行参数传递,请使用
./myProg foo \> bar
或
旁注:因为使用
将输出管道化到文件中是shell的一部分,而不是像cat
这样的程序本身,所以您可能不必担心它。只需写入stdout,shell将处理其余部分。这可能是由您运行程序的方式造成的。打字
./myProg foo > bar
将指示大多数Shell使用参数foo
运行myProg
,并将打印到stdout
的内容保存到名为bar
的文件中。要将foo
、
和bar
作为命令行参数传递,请使用
./myProg foo \> bar
或
旁注:因为使用
将输出管道化到文件中是shell的一部分,而不是像cat
这样的程序本身,所以您可能不必担心它。只需写到stdout,shell就可以处理其余部分。你所说的程序中的条件不为真是什么意思?你是说你没有看到“inside4”打印到终端上?有一些事情要考虑。首先,您不进行错误检查。我们必须假设您所有的open
和dup2
调用都成功。我希望“inside4”被打印到输出文件的末尾。原因很简单,printf
实际上并不写任何东西。它只是将字符串“inside4”存储在一个缓冲区中,但在程序退出之前,缓冲区不会写入输出,而此时底层文件描述符已更改为输出文件。最简单的修复方法是在输出中添加一个换行符,然后写入printf(“inside4\n”)
在正常设置中,打印换行符会导致刷新内部缓冲区。您还可以在调用printf
后,通过调用fflush
显式刷新缓冲区。您所说的程序中的条件未变为真是什么意思?你是说你没有看到“inside4”打印到终端上?有一些事情要考虑。首先,您不进行错误检查。我们必须假设您所有的open
和dup2
调用都成功。我希望“inside4”被打印到输出文件的末尾。原因很简单,printf
实际上并不写任何东西。它只是将字符串“inside4”存储在一个缓冲区中,但在程序退出之前,缓冲区不会写入输出,而此时底层文件描述符已更改为输出文件。最简单的修复方法是在输出中添加一个换行符,然后写入printf(“inside4\n”)
在正常设置中,打印换行符会导致刷新内部缓冲区。您还可以在调用printf
后,通过使用\>
调用fflush第一次转义
显式刷新缓冲区。在main()
/prog File1.txt>File2.txt
中第二次打印出的argv
与/prog File1.txt>File2.txt
不同。首先使用\>
转义
。在main()
/prog File1.txt>File2.txt
中第二次打印出的argv
与/prog File1.txt>File2.txt
不同。通常,允许指定输出路径的命令行应用程序根本不直接使用>操作符;相反,它们提供了一个--output=
类型参数。@Alfredargc
对于/prog File1.txt>File2.txt
是2。第一个参数是用来启动程序的路径(/prog
),第二个参数是File1.txt
。我不确定是什么原因造成的。也许是打印语句的问题导致的。现在我的程序甚至可以使用“>”。我不知道是什么原因造成的。我不知道操作系统或终端的这种奇怪行为的任何解决方案尽管这个答案表明>bar
指示shell将标准输出重定向到bar
,但它并不表示shell从命令行中删除
和bar
,因此,传递给程序的最终文本是/myProg foo
(适合在argv中分隔为字段)。由于这个问题是从一个不熟悉shell如何处理命令行并将其传递给程序的人的角度提出的,因此明确描述这些步骤会有所帮助;相反,它们提供了一个--output=
类型参数。@Alfredargc
对于/prog File1.txt>File2.txt
是2。第一个参数是用来启动程序的路径(/prog
),第二个参数是File1.txt
。我不确定是什么原因造成的。也许是打印语句的问题导致的。现在我的程序甚至可以使用“>”。我不知道什么是cau