3

这里是新手!

cat我下面的程序试图在 Linux 中表现得像(一点)命令。

  1. 如果没有提供参数,那么它会从用户那里获取输入并在屏幕上打印。(对于一个非常简单的场景,输入缓冲区假定为 10)..

  2. 如果我传递多个参数它正在工作..即它正在一一显示不同文件的内容 - 如编程..

--现在的重点是,当我在 shell 上发出命令时,例如:

./mycat abc.txt > 测试

mycat我的程序名称在哪里,abc.txt是必需的文件,我将它重定向到一个新的文件测试。我无法理解的奇怪部分是,在重定向之后,如果我查看文件测试,它首先显示文件中的数据,abc.txt然后是我在 c 程序中的 printf 函数,而不是显示 printfs,然后是数据。这是什么原因?

int main(int argc,char *argv[])
{
    char buf[10]; 
    int x,read_bytes,i,fd;
    read_bytes=1;
    char read_buf[1024*1024];

    for(i=0;i<argc;i++)
         printf("you entered  %s\n",argv[i]); //this printf

    switch(argc)
    {
    case 1:
         x=read(0,buf,sizeof(buf));
         write(1,buf,x);
         break;

    default:
         for(i=1;i<argc;i++)
         {
             printf("showing the %dth file\n\n",i);
             fd=open(argv[i], O_RDONLY);
             if(fd==-1)
             {
                 perror("no file opened for such name");
                 exit(1);
             }
             while(read_bytes!=0)
             {
                 read_bytes=read(fd,read_buf,sizeof(read_buf));
                 if(read_bytes==-1)
                 {
                     perror("not able to read\n");
                     exit(2);
                 }
                 write(1,read_buf,read_bytes);
             }
             read_bytes=1;
             close(fd);
         }
         break;
     }

     return 0;
}
4

3 回答 3

4

printf也打印到stdout,其文件描述符为1,因此您将该printf行写入与文件内容相同的输出。

您可能更喜欢将诊断写入单独的输出,例如stderr

fprintf(stderr, "Hello world.\n");
于 2012-01-11T19:40:19.193 回答
2

其他答案是正确的,但似乎无法解释问题。
两者都printf写入write(1)标准输出。但是printf是缓冲的,而write不是。
因此,您写入的数据printf首先进入某个缓冲区,并且仅在操作系统选择时才真正写入。但是,由 写入的数据write直接进入文件。
结果是打印了所有内容,但不是按照您想要的顺序。打印的数据printf可以在稍后写入的数据之后写入write

于 2012-01-11T21:25:58.003 回答
1

fflush(stdout)在每个之后使用,printf以便刷新标准输出缓冲区。完成此操作后,printfs 将按照代码顺序显示。

这是修改后的代码。

int main(int argc,char *argv[])
{
    char buf[10]; 
    int x,read_bytes,i,fd;
    read_bytes=1;
    char read_buf[1024*1024];

    for(i=0;i<argc;i++)
        printf("you entered  %s\n",argv[i]); //this printf
    fflush(stdout);
    switch(argc)
    {
     case 1:
          x=read(0,buf,sizeof(buf));
          write(1,buf,x);
          break;

     default:
          for(i=1;i<argc;i++)
          {
              printf("showing the %dth file\n\n",i);
              fflush(stdout);
              fd=open(argv[i], O_RDONLY);
              if(fd==-1)
              {
                 perror("no file opened for such name");
                 exit(1);
              }
              while(read_bytes!=0)
              {
                 read_bytes=read(fd,read_buf,sizeof(read_buf));
                 if(read_bytes==-1)
                 {
                     perror("not able to read\n");
                     exit(2);
                 }
                 write(1,read_buf,read_bytes);
             }
             read_bytes=1;
             close(fd);
         }
         break;
     }

     return 0;
}
于 2012-01-11T20:41:02.847 回答