write

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbyte);

fd:文件描述符
buf:指定的缓冲区,即指针,指向一段内存单元
nbyte:要写入文件指定的字节数
返回值:写入文档的字节数(成功);-1(出错)
write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.

read

ssize_t read  (int fd, void *buf, size_t count);

返回值
成功返回读取的字节数,出错返回-1并设置errno
如果在调read之前已到达文件末尾,则这次read返回0
参数
参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。
注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。
比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O缓冲区中,再返回第一个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中记录的读写位置是1。
注意返回值类型是ssize_t,表示有符号的size_t,
这样既可以返回正的字节数、0(表示到达文件末尾)
也可以返回负值-1(表示出错)
read函数返回时,返回值说明了buf中前多少个字节是刚读上来的。
有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count
例如:读常规文件时,在读到count个字节之前已到达文件末尾。
例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0

示例
const char * file = "hello,world\n";int main()
{//int open(constchar*pathname,intflags);//int open(constchar*pathname,intflags,mode_tmode);//返回值:成功则返回文件描述符,否则返回-1int fd = open("myfile", O_RDWR | O_CREAT, 0664);if(fd < 0){perror("open");return -1;}char * msg = "world,hello\n";ssize_t sw = write(fd, msg, strlen(file));printf("sw = %d\n", sw);if(sw < 0){perror("write");return -1;}printf("写入成功\n");char buf[13];ssize_t sr = read(fd, buf, 12);printf("sr = %d\n", sr);if( sr <= 0 ){perror("read error");return -1;}printf("读取成功\n");printf("buf = %s\n", buf);close(fd);return 0;
}

像这样, 在打开一个文件后, 用write写入, 然后立即用read读取, 此时read会返回0
因为此时文件的读取位置已经到了末尾
如何解决这个问题呢
有一个函数

lseek

#include<sys/types.h>
#include<unistd.h>off_t lseek(int filde,off_t offset ,int whence);

函数说明
每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。
当read()或write()时,读写位置会随之增加,lseek()便是用来控制文件读写位置的

  • 参数fildes 为已打开的文件描述词
  • 参数offset 为根据参数whence来移动读写位置的位移数

Offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)

参数
whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).

  • SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
  • SEEK_CUR 以目前的读写位置往后增加offset个位移量。
  • SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
下列是较特别的使用方式:

1) 欲将读写位置移到文件开头时: lseek(int fildes,0,SEEK_SET);
2) 欲将读写位置移到文件尾时: lseek(int fildes,0,SEEK_END);
3) 想要取得目前文件位置时: lseek(int fildes,0,SEEK_CUR);

返回值
当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。
若有错误则返回-1,errno 会存放错误代码。
可能设置erron的错误代码:

  • EBADF: fildes不是一个打开的文件描述符。
  • ESPIPE:文件描述符被分配到一个管道、套接字或FIFO。
  • EINVAL:whence取值不当。
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>ssize_t read(int fd, void * buf, size_t count);
//从fd里读取count大小的数据到buf中//ssize_t write(int fd, const void *buf, size_t nbyte);
ssize_t write(int fd, const void * buf, size_t nbyte);
//把buf中的nbyte大小的数据写入fdconst char * file = "hello,world\n";int main()
{//int open(constchar*pathname,intflags);//int open(constchar*pathname,intflags,mode_tmode);//返回值:成功则返回文件描述符,否则返回-1int fd = open("myfile", O_RDWR | O_CREAT, 0664);if(fd < 0){perror("open");return -1;}char * msg = "world,hello\n";ssize_t sw = write(fd, msg, strlen(file));printf("sw = %d\n", sw);if(sw < 0){perror("write");return -1;}printf("写入成功\n");sleep(1);//off_t lseek(int filde,off_t offset ,int whence);//每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,//若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。//当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。//参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。//Offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。lseek(fd, 0, SEEK_SET); //令读写位置指向开头char buf[13];//while(1){ssize_t sr = read(fd, buf, 12);printf("sr = %d\n", sr);//ssize_t read(int handle, void *buf, int nbyte);if( sr <= 0 ){perror("read error");return -1;}printf("读取成功\n");}printf("buf = %s\n", buf);//close(fd);return 0;
}

关于write和read以及文件读写位置相关推荐

  1. python中查找文件当前位置定位,Python是怎样定位和修改文件读写位置的?

    在文件的一次打开与关闭之间进行的读写操作都是连续的,程序总是从上次读写的位置继续向下进行读写操作.实际上,每个文件对象都有一个称为"文件读写位置"的属性,该属性用于记录文件当前读写 ...

  2. python中文件读写位置的作用-Python中文件的读写、写读和追加写读三种模式的特点...

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  3. python中文件读写位置的作用-Python中文件的读写

    1.Python中的open()函数 Python中提供了open()内置函数,在默认情况下可以对文件对象进行操作. open()函数将文件名作为唯一必不可少的参数,并返回一个文件对象.如果只指定一个 ...

  4. python中文件读写位置的作用-文件操作,读,写,指定位置

    [python]代码库#文件操作 open() #open("路径 + 文件名","读写模式") f=open('filepath','w') #读写模式: # ...

  5. python中文件读写位置的作用-python配置文件的读写

    1. 配置文件configuration file python中的配置文件有.conf..ini..cfg..txt等多种,其中.ini最常见 .ini文件是Initialization File的 ...

  6. Win32 基本文件读写操作

    一.创建文件 HANDLE hFile = ::CreateFile(TEXT("E:\\CreateFileDemo.txt"), //创建文件的名称.GENERIC_WRITE ...

  7. C++文件读写函数之——fopen、fread和fwrite、fgetc和fputc、fgets和fputs、ftellf和fseek、rewind...

    由于最近经常使用到c语言中的读写文件,所以在此总结以下,方便以后查找. 在c中,文件操作都是由库函数来实现的,主要是分为读和写两种操作,以下详细讲解以下所有有关文件操作的邯郸乎的用法: //C++写入 ...

  8. C/C++文件读写操作 —— windowsAPI

    转自:http://blog.sina.com.cn/s/blog_6e7fed390100z0j1.html 基于C的文件操作 在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件 ...

  9. C文件操作、读写文件 C++文件读写、文件操作

    转自  飘羽随风 基于C的文件操作  在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之. 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FI ...

  10. 全网最详细C/C++文件读写总结

    1.linux系统函数文件读写 open函数: int open(const char * pathname, int flags); int open(const char * pathname, ...

最新文章

  1. 加薪方式的真相!你是哪一种?
  2. 3种骚操作,教你查看 Java 字节码!
  3. raise IOError('The file is not exist!')
  4. 修改Linux启动后的默认颜色,更改linux目录的默认颜色(我选择了Yellow)
  5. date 减去固定时长_javascript – 从Date对象减去日/月/年
  6. git如何切换用户_git切换用户、多用户切换的正确方式 git commit和git push 切换用户...
  7. 腾讯又“撒钱”了!奖励2.28万员工800万股,人均16.6万港元 网友:福利界天花板...
  8. 【nginx】nginx 动静分离
  9. Flutter高级第2篇:JSON的序列化和反序列化、创建模型类转换Json数据
  10. 全国市级城市拼音-中文对照表(json格式)
  11. sql优化工具explain的使用
  12. pic系列单片机c语言编程与应用实例,PIC单片机C语言编程实例
  13. 儿童车内滞留监测控制系统的设计
  14. cad详图怎么画_CAD结构图怎么画?手把手教你CAD结构图的绘制方法
  15. mysql先过滤后分组_MySQL分组过滤
  16. 基于神经网络的预测控制,神经网络预测系统应用
  17. MyISAM和InnoDB的区别
  18. 可视化|东京奥运会可视化(二)
  19. 基于Java实现简单的在线 OJ 系统
  20. 快速学习-Saturn用户的认证与授权

热门文章

  1. kafka第二次课!!!
  2. ECMAScript 变量
  3. 简单的js时间转中文大写时间
  4. 中考计算机考键盘,信息技术中考键盘常识复习讲座.ppt
  5. 【艾琪出品】-【计算机应用基础】测试题系列一、在线作业参考资料
  6. 解除pdf文件打印限制
  7. 在mac上使用vscode创建第一个Python项目
  8. 虚拟机 服务器 root,虚拟机切换到root账户
  9. 5大国外广告联盟赚美金项目,诱人的美金在向你招手!
  10. 网络信息检索(一)检索模型:布尔,向量,概率检索