【问题标题】:Why is my C program not printing anything out?为什么我的 C 程序没有打印出任何东西?
【发布时间】:2014-03-17 18:01:19
【问题描述】:

我的代码应该读取命令行中给出的 2 个文件,然后将它们打印到 STDOUT,除非给出第三个参数,在这种情况下,它应该打印到该文件而不是 STDOUT。 我觉得一切都是正确的,但是当我运行程序时,什么都没有打印出来。有什么你能发现的,为什么不呢?一双新的眼睛总是有帮助的。

int main(int ARGC, char *ARGV[]) {
   char buf1[1024];
   char buf2[1024];
   int n=0; 
   int m=0; 
   int fd=open(ARGV[1],O_RDONLY);
   int fd2=open(ARGV[2],O_RDONLY);
   int fd3=open(ARGV[3],O_WRONLY);

   do {
      int n= read(fd,buf1,sizeof(buf1));
      if(n<0) {
         perror("read error1");
      }
      if(fd3!=0) {
         write(fd3,buf1,n);
      }

      if(fd3==0) {
         write(STDOUT_FILENO,buf1,n);
      }

   } while(n==sizeof(buf1));

   do{
      int m=read(fd2,buf2,sizeof(buf2));
      if(m<0) {
         perror("read error2");
      }
      if(fd3!=0) {
         write(fd3,buf2,m);
      }
      if(fd3==0) {
         write(STDOUT_FILENO,buf2,m);
      }
   } while(m==sizeof(buf2));
}

【问题讨论】:

  • 我的眼睛因试图跟随您不一致的缩进而受伤。
  • 啊,那不那么痛苦了。谢谢,好的。
  • 您为什么期望 f3 被设置为 0
  • @alk 是对的。应初始化为 0,然后仅当 argc > 3 时才将其设置为 open 的结果。在您的代码中,如果未定义的行为不影响您,它将为 -1。
  • “脚本”?您使用的是 C 解释器吗? C 通常产生“程序”:)

标签: c low-level-io


【解决方案1】:

当你离开第三个参数时,你永远不会写到屏幕上。

int fd3=open(ARGV[3],O_WRONLY); 带有空的或垃圾的ARGV[3] 可能会将fd3 设置为-1,而不是0。因此,您永远不会写入 STDOUT_FILENO,而是写入无效的文件描述符。

【讨论】:

  • 这很有道理!谢谢你。以及所有回复的人。
  • 因此吸取的教训是:始终测试系统调用的结果(此处为write())。
  • 当给出第三个参数时,我让它打印到 STDOUT 但不打印到输出文件?
  • 第三个文件需要已经存在...@RickGarcia 将O_CREAT | O_WRONLY 传递给open() 的第三次调用以创建文件以防万一它不存在。
  • 它正在创建文件但拒绝我对它进行 cat 它的权限
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2013-04-06
  • 2012-12-30
  • 2014-07-03
  • 1970-01-01
相关资源
最近更新 更多