LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1773|回复: 18

怎么每次读和写一个字节从一个文件?

[复制链接]
发表于 2004-3-26 12:45:10 | 显示全部楼层 |阅读模式
不知道这个程序错在哪里?
请高手指点!

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. int
  6. main(void)
  7. {
  8.      size_t n,tmp;
  9.      char   *c;
  10.      int    fd;
  11.      if((fd=open("/etc/fstab",O_RDONLY))<0) { /* open /etc/fstab file */
  12.             printf("open fstab error\n");
  13.             return(1);
  14.      }
  15.      for(n=1;n<10;n++) {
  16.             if((tmp=read(fd,&c,1)) != 1) { /* read 1 byte */
  17.                      printf("read %d error\n",n);
  18.                      return(1);
  19.             } else {
  20.                      if(write(STDOUT_FILENO,&c,tmp)<0) { /* write the byte to   
  21.                                                       stdout */
  22.                             printf("write %d error",n) ;
  23.                             return(1);
  24.                      }
  25.            }
  26.            *c +=1; /* memory point add 1 byte */
  27.       }
  28.       return(0);
  29. }
复制代码
发表于 2004-3-26 15:25:29 | 显示全部楼层
mmap
发表于 2004-3-26 17:40:02 | 显示全部楼层
c似乎不应该定义成指针。
发表于 2004-3-26 18:36:34 | 显示全部楼层
楼主还是先好好掌握一下read()、write()这些函数的用法,呵呵。。。
发表于 2004-3-26 20:34:53 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>

  5. int
  6. main(void)
  7. {
  8.   size_t n; /* [color=red]tmp不需要[/color] */
  9.   char c; /* [color=red]注意这里[/color] */
  10.   int fd;
  11.   
  12.   if((fd = open("/etc/fstab", O_RDONLY)) < 0) { /* open /etc/fstab file */
  13.     printf("open fstab error\n");
  14.     return(1);
  15.   }
  16.   for(n=1; n<10; n++){ /* [color=red]C语言中很少用n=1的,一般用n=0[/color] */
  17.     if(read(fd, &c, 1) != 1) { /* read 1 byte */
  18.       printf("read %d error\n", n);
  19.       return(1);
  20.     }else{
  21.       if(write(STDOUT_FILENO, &c, 1) != 1) { /* write the byte to
  22.                                                stdout */
  23.         printf("write %d error", n) ;
  24.         return(1);
  25.       }
  26.     }
  27.   }
  28.   return(0);
  29. }
复制代码
 楼主| 发表于 2004-3-26 20:36:38 | 显示全部楼层
read()和write()的用法我是看这个例程的,但我看了很久都看不懂@@@@

  1. #include "unp.h"
  2. ssize_t
  3. readline(int fd,void *vptr,size_t maxlen)
  4. {
  5.        ssize_t     n,rc;
  6.        char        c,*ptr;
  7.        ptr=vptr;
  8.        for(n=1;n<maxlen;n++) {
  9.            again:
  10.                if((rc=read(fd,&c,1)) == 1) {
  11.                       *ptr ++=c ;
  12.                       if(c == '\n')
  13.                                break;        /* newline is sotred,like fgets() */
  14.                       }else if(rc==0) {
  15.                                if(n==1)
  16.                                       return(0);  /* EOF,no data read */
  17.                                else
  18.                                       break;      /* EOF,some data was read */
  19.                       }else {
  20.                                if(errno==EINTR)
  21.                                       goto again;
  22.                                return(-1);       /* error,errno set by read() */
  23.                       }
  24.        }
  25.        *ptr = 0 ;    /* null terminate like fgets() */
  26.        return(n);
  27. }
复制代码

从一个描述字读文本文件,一次一个字节@-@,难道教程错了,我也感到上一贴read() and writea()的用法不对头/
发表于 2004-3-26 21:55:46 | 显示全部楼层
用read的时候,很多时候都不需要一个指向文件的指针的,直接就可以用了,read里有个文件指针,这是steven自己写的一个读一行的函数,if read那,不知道你有没有贴错,应该是不等于?
发表于 2004-3-27 08:45:47 | 显示全部楼层
楼上的说法不够准确。read使用的是文件描述符,fread使用的才是文件指针。
在if((rc=read(fd,&c,1)) == 1) 中read(fd,&c, 1)的返回值是实际读取的字节数,而fread()返回的是实际读取的数据项数。你可以仔细看看它们的man文档。
发表于 2004-3-27 10:55:37 | 显示全部楼层
//nod
open/read/write/gets/getc等是linux直接提供的系统调用
fopen/fread/fwrite/fgets/fgetc/feof等是标准库函数,用文件流输入输出,是在系统调用的基础上增加了buffer实现的。
两套函数的标识符(或者说是文件句柄)是不能混用的。只能通过fdopen或者fileno来显式转换
 楼主| 发表于 2004-3-27 21:42:05 | 显示全部楼层
帮忙阿!!!没见过这种用法:
if((rc=read(fd,&c,1)) == 1) {

特别是&c,按照我的程序怎么写出你,请大家改改。。。。。。。:rolleyes: :rolleyes: :thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表