Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1590822
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2008-04-22 17:28:07

在linux或者windows下你会经常用到echo这个命令,这个命令将输入拷贝到输出,即你输入什么,它就输出什么,下面,我们用编程的方式也来简单的模仿一下它的实现:

首先要看一下几个相关的函数:

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
read 函数从文件描述符 fd 中读取count 大小的内容到buf
write 函数向文件描述符 fd 中写入count 大小的内容, 要写的内容放在buf
 
#include <stdio.h>
int getc(FILE *stream);
int putc(int c, FILE* stream);
getcstream中读取一个字符
putc 将一个字符写入stream

我们都知道,现代的操作系统都有三个标准的输入输出,它们的是标准输入、 标准输出和标准错误, 文件描述符分别是stdin, stdout 和 stderr, 或者用0, 1, 2表示, 在linux中有三个宏定义:STDIN_FILENO, STDOUT_FILENO 和 STDERR_FILENO。

下面我们通过2个实例来看看具体应用:

下载:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3.  
  4. #define BUF_SIZ    4096
  5.  
  6. int main(void)
  7. {
  8.     int n;
  9.     char buf[BUF_SIZ];
  10.  
  11.     while ( (n = read(STDIN_FILENO, buf, BUF_SIZ)) > 0 )
  12.     {
  13.         if ( write(STDOUT_FILENO, buf, n) != n )
  14.         {
  15.             printf("write error.\n");
  16.             exit(-1);
  17.         }
  18.     }
  19.     if ( n < 0)
  20.     {
  21.         printf("read error\n");
  22.         exit(-2);
  23.     }
  24.    
  25.     exit(0);
  26. }

该程序利用系统调用直接从STDIN_FILENO中读最多BUF_SIZ大小的数据到缓冲区buf中,然后用write将其写入到STDOUT_FILENO中。
下面的一个例子和上面的效果差不多,但没有缓冲区大小限制,它是利用标准的IO函数来操作的。

下载:
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.     int c;
  6.  
  7.     while ( (c = getc(stdin)) != EOF )
  8.     {
  9.         if ( putc(c, stdout) == EOF )
  10.         {
  11.             printf("error putc\n");
  12.             exit(-1);
  13.         }
  14.     }
  15.  
  16.     if (ferror(stdin))
  17.     {
  18.         printf("input error\n");
  19.         exit(-2);
  20.     }
  21.     exit(0);
  22. }
阅读(755) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~