CommandLine参数不起作用C.

时间:2012-12-10 16:13:24

标签: 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);
    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.为什么会这样?

此致

2 个答案:

答案 0 :(得分:5)

这可能是由于您运行程序的方式造成的。打字

./myProg foo > bar

将指示大多数shell使用参数myProg运行foo,并将打印到stdout的任何内容保存在名为bar的文件中。要将foo>bar作为命令行参数传递,请使用

./myProg foo \> bar

./myProg 'foo' '>' 'bar'

旁注:因为使用>将管道输出到文件中是shell的一部分,而不是cat本身的程序,所以您可能不必担心它。只需写入stdout,shell将处理其余部分。

答案 1 :(得分:1)

the condition in the program is not getting true你是什么意思?你是说你没有在终端上看到“inside4”?有几点需要考虑。首先,您不进行错误检查。我们必须假设您的所有opendup2来电均已成功。我希望“inside4”打印到输出文件的末尾。原因很简单,printf实际上并没有写任何东西。它只是将字符串“inside4”存储在缓冲区中,但是在程序退出之前,该缓冲区不会写入输出,到那时基础文件描述符已更改为输出文件。最简单的解决方法是在输出中附加换行符,并写入printf( "inside4\n" );在正常设置中,打印换行符会导致内部缓冲区被刷新。您也可以在调用printf后调用fflush来显式刷新缓冲区。