gpt4 book ai didi

c - 在 C 中重写标准输入和输出

转载 作者:行者123 更新时间:2023-11-30 19:23:02 24 4
gpt4 key购买 nike

我编写此代码是为了覆盖 Ubuntu 中的 cat 命令。以下三种格式的 cat 指令工作正常,但其余格式不起作用。

工作中的:

  • ./catf > 文件.txt
  • ./catf < 文件.txt

不工作:

  • ./catf File1.txt > File.txt
  • ./catf 文件.txt

我正在将终端参数发送到上面列出的程序。另一个问题是每个文件还包含 Enter your String: ,但它不应该包含。这里是代码:

int main(int argc, char *argv[])
{
int readbytes,fp;
char buf[1024];
if(argc==1)
{
printf("Enter your String :\n\n");
readbytes=read(STDIN_FILENO,buf,1024);
write(STDOUT_FILENO,buf,readbytes);
}
else 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);
}
else if(argc==3)
{
if(argv[1][0]=='<')
{
fp=open(argv[2],O_WRONLY|O_CREAT,S_IRWXU);
dup2(1,fp);
close(fp);
readbytes=read(STDIN_FILENO,buf,1024);
write(STDOUT_FILENO,buf,readbytes);
}
else if(argv[1][0]=='>')
{
fp=open(argv[2],O_RDONLY);
dup2(1,fp);
close(fp);
readbytes=read(STDIN_FILENO,buf,1024);
write(STDOUT_FILENO,buf,readbytes);
}
}
else if(argc==4)
{
printf("inside");
fp=open(argv[1],O_RDONLY);
dup2(0,fp);
close(fp);
fp=open(argv[3],O_WRONLY|O_CREAT,S_IRWXU);
dup2(1,fp);
close(fp);
readbytes=read(STDIN_FILENO,buf,1024);
printf("%c",buf);
write(STDOUT_FILENO,buf,readbytes);
}
return 0;
}

更新:

我在代码中进行了 William 建议的更改,其余代码工作正常,但此 ./catf File.txt ">"File2.txt 仍然无法工作。这是为什么?

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);
}

造成上述问题的原因是什么?

最佳答案

当您调用cat > file1.txt时, *argv[1]不是< 。相反,argc为 1,且 stdout 在 main 时已与该文件关联。叫做。如果您想通过<作为通过 shell 的参数,您需要引用它:

$ cat '<' filename

此外,您对 dup2 的调用论证是否颠倒; STDOUT_FILENO应该是第二个参数,而不是第一个。你的 argc==2 中的方式条款即将结束fp并将其重新打开到原始标准输出。

关于c - 在 C 中重写标准输入和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13802184/

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