linux中文件I/O操作(系统I/O)
来源:互联网 发布:域名注册投资 编辑:程序博客网 时间:2024/06/05 14:26
用到的文件I/O函数有以下几个:打开文件、读文件、写文件、关闭文件等
对应用到的函数有:open、read、write、close、lseek(文件指针偏移)
文件描述符:对于内核而言,所有打开的文件都通过文件按描述符引用。文件描述符是一个非负整数。
当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
当读、写一个文件时,使用open/creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
linux系统下文件描述符0是标准输入,1是标准输出,2是标准出错,所以一般打开文件的时候文件描述符都是从3开始。
一、打开文件
(1)头文件
#include <sys/types.h>
#include <sys/stat.h>
b、 flags:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:读、写打开
O_CREAT:若此文件不存在则创建它,使用O_CREAT时后面要跟文件的访问权限位,如O_CREAT,0777
O_APPEND:每次写时都追加到文件的尾端
O_EXCL :如果同时指定了O_CREAT,而文件已经存在,则出错,用此可以测试一个文件是否
存在,如果不存在,则创建此文件,这使测试和创建两者成为一个原子操作
O_DSYNC:使每次write等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的
数据,则不需等待文件属性被更新
O_NONBLOCK :如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则
此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式
O_NOCTTY:如果path引用的是 终端设备,则将该设备分配为此进程的控制终端
O_SYNC:使每次write要等待物理I/O操作完成,包括有该write引起的文件属性更新所需的I/O
O_TRUNC:如果文件存在,并且是常规文件而且以读写或者只写打开,则将其长度截断为0,
如果文件是FIFO或终端设备文件,O_TRUNC标志被忽略,否则O_TRUNC不明确
O_DIRECTORY:如果pathname引用的不是目录,则出错
(3)返回值:
成功:文件描述符
失败:-1
二、读取文件
(1)头文件 #include <unistd.h>
(2)函数原型 ssize_t read(int fd, void *buf, size_t count);
参数:
a、fd:调用open后返回的文件描述符
b、buf:用来存放从文件中读到的数据的缓冲区
c、count:读取的字节数
(3)返回值:
成功:读到的字节数,如果读到文件尾端,则返回0
失败:-1
三、写数据
参数:
a、fd:调用open后返回的文件描述符
b、buf:从来存放数据的缓冲区
c、count:写入数据的字节数
(3)返回值:
成功:返回已写的字节数
失败:-1
四、关闭文件
(1)头文件 #include <unistd.h>
(2)函数原型 int close(int fd);
参数:
a、fd:调用open后返回的文件描述符
五、文件偏移
(1)头文件 #include <sys/types.h>
#include <unistd.h>
(2)函数原型 off_t lseek(int fd, off_t offset, int whence);
参数:
a、fd:调用open后返回的文件描述符
b、offset 和参数whence有关,通常设置为0 (according to thedirective whence as follows)
c、whence:
SEEK_SET: 将文件的偏移量设置为距文件开始处offset个字节
SEEK_CUR:将文件的偏移量设置为其当前值加offset个字节,offset可为正或负
SEEK_END: 将文件的偏移量设置为文件长度加offset,offset可为正或负
(3)返回值:
成功:返回新的文件偏移量
对应用到的函数有:open、read、write、close、lseek(文件指针偏移)
文件描述符:对于内核而言,所有打开的文件都通过文件按描述符引用。文件描述符是一个非负整数。
当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
当读、写一个文件时,使用open/creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
linux系统下文件描述符0是标准输入,1是标准输出,2是标准出错,所以一般打开文件的时候文件描述符都是从3开始。
一、打开文件
(1)头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
(2)函数原型 int open(const char *pathname, int flags);参数:
b、 flags:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:读、写打开
O_CREAT:若此文件不存在则创建它,使用O_CREAT时后面要跟文件的访问权限位,如O_CREAT,0777
O_APPEND:每次写时都追加到文件的尾端
O_EXCL :如果同时指定了O_CREAT,而文件已经存在,则出错,用此可以测试一个文件是否
存在,如果不存在,则创建此文件,这使测试和创建两者成为一个原子操作
O_DSYNC:使每次write等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的
数据,则不需等待文件属性被更新
O_NONBLOCK :如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则
此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式
O_NOCTTY:如果path引用的是 终端设备,则将该设备分配为此进程的控制终端
O_SYNC:使每次write要等待物理I/O操作完成,包括有该write引起的文件属性更新所需的I/O
O_TRUNC:如果文件存在,并且是常规文件而且以读写或者只写打开,则将其长度截断为0,
如果文件是FIFO或终端设备文件,O_TRUNC标志被忽略,否则O_TRUNC不明确
O_DIRECTORY:如果pathname引用的不是目录,则出错
(3)返回值:
成功:文件描述符
失败:-1
二、读取文件
(1)头文件 #include <unistd.h>
(2)函数原型 ssize_t read(int fd, void *buf, size_t count);
参数:
a、fd:调用open后返回的文件描述符
b、buf:用来存放从文件中读到的数据的缓冲区
c、count:读取的字节数
(3)返回值:
成功:读到的字节数,如果读到文件尾端,则返回0
失败:-1
三、写数据
(1)头文件 #include <unistd.h>
参数:
a、fd:调用open后返回的文件描述符
b、buf:从来存放数据的缓冲区
c、count:写入数据的字节数
(3)返回值:
成功:返回已写的字节数
失败:-1
四、关闭文件
(1)头文件 #include <unistd.h>
(2)函数原型 int close(int fd);
参数:
a、fd:调用open后返回的文件描述符
五、文件偏移
(1)头文件 #include <sys/types.h>
#include <unistd.h>
(2)函数原型 off_t lseek(int fd, off_t offset, int whence);
参数:
a、fd:调用open后返回的文件描述符
b、offset 和参数whence有关,通常设置为0 (according to thedirective whence as follows)
c、whence:
SEEK_SET: 将文件的偏移量设置为距文件开始处offset个字节
SEEK_CUR:将文件的偏移量设置为其当前值加offset个字节,offset可为正或负
SEEK_END: 将文件的偏移量设置为文件长度加offset,offset可为正或负
(3)返回值:
成功:返回新的文件偏移量
失败:-1
下面是代码:
#include <sys/types.h>#include <sys/stat.h>#include <sys/fcntl.h>#include <stdio.h>#include <errno.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#define PATHNAME "text.txt"#define LENGTH 4096void error(char *name) //错误提示{perror(name);exit(1);}int main(int argc,char *argv[]){int fd ; //存放文件描述符int size1; //读操作时的返回值int size; //写操作时的返回值int offset; //文件偏移量 //打开文件/*O_REWR表示已读写权限打开文件,O_CREAT表示如果文件不存在则创建*创建的新文件的权限为0777,即是可读可写可执行,O_APPEND表示 *写入数据时从文件尾端写入*/ if((fd = open(PATHNAME,O_RDWR|O_CREAT|O_APPEND,0777)) == -1) {error("open");} char buf[LENGTH];bzero(buf,sizeof(buf)); //从文件中读取数据 if((size1 = read(fd,buf,sizeof(buf))) == -1){error("read");}printf("%s\n",buf); char buf1[LENGTH] = "小世界"; //写入数据到文件中 if((size = write(fd,buf1,sizeof(buf))) == -1) { error("write"); }char buf3[LENGTH] = "hello world";if((size = write(fd,buf3,sizeof(buf3))) == -1){error("write");}//因为写入数据到文件中的时候已经把文件指针偏移到文件尾端了,所以要重新把文件指针偏移到文件头,方便下面的读操作if((offset = lseek(fd,0,SEEK_SET)) == -1){error("lseek");}bzero(buf,sizeof(buf)); if((size1 = read(fd,buf,sizeof(buf))) == -1){error("read");}printf("%s\n",buf);//关闭文件close(fd);return 0;}
这是我在ubuntu下运行的结果,有个很奇怪的地方就是我在windows下打开文件的时候并没有看到后面写进去的内容,但是在ubuntu下用cat命令却能看到全部写进去的内容,而且终端中输出也看不到,不知道有哪位大神知道这个该怎么弄
用cat命令打开文件:
终端输出:
阅读全文
0 0
- linux中文件I/O操作(系统I/O)
- linux中文件I-O操作(系统I-O)
- Linux下文件I/O操作详解
- unix中文件I/O
- linux I/O操作
- Linux系统调用之I/O操作
- Linux文件I/O操作
- linux下I/O操作
- Linux文件I/O操作
- 文 件 I / O
- Linux系统标准I/O(5.29)
- linux 系统I/O 1
- Linux 系统 I/O编程-----不带缓存的I/O操作
- Linux 系统 I/O编程-----不带缓存的I/O操作
- Linux系统文件I/O编程(三)---I/O多路复用
- Linux系统文件I/O编程(三)---I/O多路复用
- I/O操作(上)
- I/O操作(下)
- quartz定时任务时间设置
- Spring Cloud 的 Hystrix 通过Fallback Factory 检查回退的错误原因
- R-CNN&SPPNet
- 第一周 leetcode算法题(easy)之 Two Sum
- 利用Scroller实现自己的滑动布局
- linux中文件I/O操作(系统I/O)
- 机器学习第十四课part1(Jensen不等式,最大似然估计回顾,Gaussian Mixture Model)
- 121. Best Time to Buy and Sell Stock
- Eclipse快捷键大全
- CentOS6.5环境下编译hadoop2.8.1源码
- Java经典面试题(6)
- spring boot maven版普通JAVA项目
- struts2页面跳转及请求时的页面映射
- 互联网世界中的C语言——我的golang学习笔记:1(基础语法快速过)