Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119027
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 214
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-24 17:47
个人简介

今天所拥有的一切,都是自己的选择

文章分类

全部博文(26)

文章存档

2013年(26)

我的朋友

分类: C/C++

2013-10-27 12:25:55

open 用来打开或创建一个文件
头文件:#include
           #include
           #include
           int open(const char *pathname, int flags);
           int open(const char *pathname, int flags, mode_t mode)
函数说明:
            
            

返回值:open 返回一个新的文件描述符 (若是 有 错误 发生 返回 -1 ,并在 errno 设置错误信息). 
范例:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <unistd.h>

  4. int main(int argc, char **argv)
  5. {
  6.     int fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0642);

  7.     close(fd);

  8.     return 0;
  9. }



close 关闭一个文件描述符
总览:
       #include
        int close(int fd);
描述:
       close 关闭 一个 文件 描述符 , 使它 不在 指向 任何 文件 和 可以 在 新的 文件 操作 中 被 再次
       使用.  任何 与 此 文件 相关联 的 以及 程序 所 拥有 的 锁 , 都 会 被 删除 (忽略 那些 持有 锁
       的 文件描述符)
       假如  fd  是 最后 一个 文件描述符 与此 资源 相 关联 , 则 这个 资源 将 被 释放.  若此 描述符
       是 最后 一个 引用 到 此 文件 上 的 , 则 文件 将 使用 unlink(2) 删除.
返回值:
       close 返回 0 表示 成功 , 或者 -1 表示 有 错误 发生 .
错误信息:
       EBADF  fd 不是 一个 有效 的 已 被 打开 的 文件 的 描述符
       EINTR  The close() 调用 被 一 信号 中断.
       EIO    I/O 有 错误 发生
范例:参考open

read 在文件描述符上执行读操作

概述
       #include
       ssize_t read(int fd, void *buf, size_t count);
描述
       read() 从文件描述符 fd 中读取 count 字节的数据并放入从 buf 开始的缓冲区中.
       如果  count  为零,read()返回0,不执行其他任何操作.  如果count大于SSIZE_MAX,那么结果将不可预料.
返回值
       成功时返回读取到的字节数(为零表示读到文件描述符),
       此返回值受文件剩余字节数限制.当返回值小于指定的字节数时
       并不意味着错误;这可能是因为当前可读取的字节数小于指定的
       字节数(比如已经接近文件结尾,或者正在从管道或者终端读取数据,或者 read()被信号中断).
       发生错误时返回-1,并置 errno 为相应值.在这种情况下无法得知文件偏移位置是否有变化.
范例:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <unistd.h>

  4. #if 0
  5. #define N 64

  6. int main(int argc, char **argv)
  7. {
  8.     int fd = open(argv[1], O_RDONLY);
  9.     char buf[N];
  10.     int n, i;

  11.     printf("read number = %d\n", n=read(fd, buf, N));

  12.     for(i=0; i<n; i++)
  13.     {
  14.         printf("%d\n", buf[i]);
  15.     }

  16.     close(fd);

  17.     return 0;
  18. }
  19. #endif

  20. #if 0
  21. struct
  22. {
  23.     int number;
  24.     char name[32];
  25.     int age;
  26. }student[2];

  27. int main(int argc, char **argv)
  28. {
  29.     int fd = open(argv[1], O_RDONLY);

  30.     read(fd, student, sizeof(student));

  31.     printf("%d %s %d\n", student[0].number, student[0].name, student[0].age);
  32.     printf("%d %s %d\n", student[1].number, student[1].name, student[1].age);

  33.     close(fd);

  34.     return 0;
  35. }
  36. #endif

  37. #if 1
  38. int main(int argc, char **argv)
  39. {
  40.     int fd = open(argv[1], O_RDONLY);
  41.     float f[2];

  42.     read(fd, f, sizeof(f));

  43.     printf("%g\n", f[0]);
  44.     printf("%g\n", f[1]);

  45.     close(fd);

  46.     return 0;
  47. }
  48. #endif
write 在一个文件描述符上执行写操作
概述
       #include
       ssize_t write(int fd, const void *buf, size_t count);
描述
       write   向文件描述符   fd   所引用的文件中写入  从  buf  开始的缓冲区中  count  字节的数据.
       POSIX规定,当使用了write()之后再使用  read(),那么读取到的应该是更新后的数据.
       但请注意并不是所有的文件系统都是 POSIX兼容的.
返回值
       成功时返回所写入的字节数(若为零则表示没有写入数据).  错误时返回-1,并置errno为相应值.
       若count为零,对于普通文件无任何影响,但对特殊文件 将产生不可预料的后果.
范例:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <unistd.h>

  4. #if 0
  5. struct
  6. {
  7.     int number;
  8.     char name[32];
  9.     int age;
  10. }student[2] = {{1, "niu", 20}, {2, "zhang", 50}};

  11. int main(int argc, char **argv)
  12. {
  13.     int fd = open(argv[1], O_WRONLY|O_CREAT, 0666);

  14.     write(fd, student, sizeof(student));

  15.     close(fd);

  16.     return 0;
  17. }
  18. #endif

  19. #if 1
  20. int main(int argc, char **argv)
  21. {
  22.     int fd = open(argv[1], O_WRONLY|O_CREAT, 0666);
  23.     float f[2] = {1.234, 112.456};

  24.     write(fd, f, sizeof(f));

  25.     close(fd);

  26.     return 0;
  27. }
  28. #endif

lseek 显示定位一个已经打开的文件
总览:
       #include
       #include
       off_t lseek(int fd, off_t offset, int whence);
描述:
每个打开的文件都有一个与其相关的“当前文件位移量”,它是一个非负整数,用以度量从文件开始处计算的字节数。
通常,读/写操作都从当前文件位移量处开始,在读/写调用成功后,使位移量增加所读或者所写的字节数。
lseek()调用成功为新的文件位移量失败返回- 1 并设置errno。
lseek()只对常规文件有效,对socket 、管道、FIFO等进行lseek()操作失败。
lseek()仅将当前文件的位移量记录在内核中,它并不引起任何I/O 操作。
文件位移量可以大于文件的当前长度,在这种情况下,对该文件的写操作会延长文件,并形成空洞。
范例:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <unistd.h>

  4. int main(int argc, char **argv)
  5. {
  6.     int fd = open(argv[1], O_RDWR|O_CREAT, 0666);

  7.     printf("%ld\n", lseek(fd, 0, SEEK_CUR));
  8.     write(fd, "n", 1);
  9.     printf("%ld\n", lseek(fd, 0, SEEK_CUR));
  10.     write(fd, "iu good man", 11);
  11.     printf("%ld\n", lseek(fd, 0, SEEK_CUR));

  12.     lseek(fd, 0, SEEK_SET);
  13.     write(fd, "N", 1);
  14.     lseek(fd, 4, SEEK_SET);
  15.     write(fd, "G", 1);
  16.     lseek(fd, 9, SEEK_SET);
  17.     write(fd, "M", 1);
  18.     
  19.     return 0;
  20. }


阅读(1556) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~