文件操作相关函数(POSIX 标准 open,read,write,lseek,close)
POSIX标准
open函数属于Linux中系统IO,用于“打开”文件,代码打开一个文件意味着获得了这个文件的访问句柄。
int fd = open(参数1,参数2,参数3);
int fd = open(const char *pathname,int flags,mode_t mode);
1.句柄(file descriptor 简称fd)
首先每个文件都属于自己的句柄,例如标准输入是0,标准输出是1,标准出错是2。
每打开一个文件就会返回句柄来操作这个文件,一般是从3开始,然后4,5,6一直下去。
close(fd)之后句柄就返回给系统,例如打开一个文件后fd是3,close之后再打开另外一个文件也还是3,但代表的文件不一样了。
2.使用open前需要先包含头文件
#include <sys/types.h>
#inlcude <sys/stat.h>
#inlcude <fcntl.h>
3.参数1(pathname)
即将要打开的文件路径,例如:“a.txt”当前目录下的a.txt文件
4.参数2(flags)
flags分为两类:主类,副类
主类:O_RDONLY 以只读方式打开 / O_WRONLY 以只写方式打开 /O_RDWR 以可读可写方式打开
三这是互斥的
副类:
O_CREAT 如果文件不存在则创建该文件
O_EXCL 如果使用O_CREAT选项且文件存在,则返回错误消息
O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端
O_TRUNC 如果文件已经存在则删除文件中原有数据
O_APPEND 以追加的方式打开主副可以配合使用,
例如:O_RDWR|O_CREAT|O_TRUNC
5.参数3(mode)
mode:如果文件被新建,指定其权限未mode
mode是八进制权限码,0777表示文件所有者 该文件用户组 其他用户都有可读可写可执行权限
//例:
int fd;
fd = open("file",O_RDONLY);
if(fd < 0)
打开失败
else
打开成功
read函数 读取文件 磁盘上一份 内存中一份
ssize_t count = read(参数1,参数2,参数3)
ssize_t read(int filedes,void *buf,size_t nbytes);
1.count 返回读到的字节数
若成功返回读到的字节数,若读到文件末尾返回0,若失败返回-1。
2.使用read前需要先包含头文件
#include <unistd.h>
3.参数1 (filedes)
filedes:open函数的成功返回值
4.参数2 (buf)
内存地址(开辟空间 栈、堆)
5.参数3 (nbytes)
数据大小(空间大小)
例如:
1 #include <stdio.h>
2 #include <fcntl.h>
3
4 int main(int argc,char **argv)
5 {
6 int fd;
7 char ch;
8 //打开文件
9 fd = open("file",O_RDONLY);//abcdefg
10 if(fd < 0)
11 //打开失败
12 return -1;
13 //读取文件
14 read(fd,&ch,1);
15 printf("%c\n",ch);
16 read(fd,&ch,1);
17 printf("%c\n",ch);
18 return 0;
19 }
问题:那么一次到底读取多少字节合适?
BUFSIZ 8192
read(fd,buf,sizeof(buf)-1);
2.使用write前需要先包含头文件
#include <unistd.h>
3.参数1(filed)
4.参数2(buf)
5.参数3(nbytes)
off_t currpos = lseek(参数1,参数2,参数3)
2.使用write前需要先包含头文件
#include <unistd.h>
3.参数1(fileds)
4.参数2(offset)
5.参数(whence)
文件开始 当前位置 文件末尾
SEEK_SET SEEK_CUR SEEK_END
close(参数1)
参数1:open函数的成功返回值
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
#define BUFFER_SIZE 1024
int main( int argc,char **argv)
{
int from_fd,to_fd;
long file_len=0;
int ret=1;
char buffer[BUFFER_SIZE];
char *ptr;
//判断入参
if(argc!=3)
{
printf("Usage:%s fromfile tofile !\n",argv[0]);
exit(1);
}
//打开源文件
if( (from_fd = open(argv[1],O_RDONLY | O_CREAT ))==-1)
{
printf("Open %s Error!\n",argv[1]);
exit(1);
}
//创建目的文件
if( (to_fd = open(argv[2], O_WRONLY | O_CREAT))==-1)
{
printf("Open %s error! \n",argv[2]);
exit(1);
}
//测得文件大小
file_len=lseek(from_fd,0,SEEK_END);
lseek(from_fd,0,SEEK_SET);
printf("from file size is %d!\n",file_len);
//进行文件拷贝
while(ret)
{
ret = read(from_fd, buffer, BUFFER_SIZE);
if(ret == -1)
{
printf("read error!\n");
exit(1);
}
write(to_fd, buffer, ret );
file_len = ret;
bzero( buffer, BUFFER_SIZE );
}
printf("there are %d buyes data left without copy!\n",file_len);
close(from_fd);
close(to_fd);
exit(0);
}
文件操作相关函数(POSIX 标准 open,read,write,lseek,close)的更多相关文章
- Yuchuan_linux_C 编程之八 文件操作相关函数
一.整体大纲 st_mode整体介绍: st_mode详细介绍: 二. Linux文件操作相关函数 1. stat 作用:获得文件信息,也可以获取文件大小. 头文件 #include <sys/ ...
- Linux 文件操作——系统调用和标准I/O库
一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等 ...
- C语言文件操作相关函数
在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...
- php 对文件操作相关函数
1.fopen() :函数打开文件或者 URL.如果打开失败,本函数返回 FALSE. 2.fwrite() : 写入文件(可安全用于二进制文件);fwrite(file,string,length) ...
- 浅谈无缓存I/O操作和标准I/O文件操作差别
首先,先略微了解系统调用的概念: 系统调用,英文名system call,每一个操作系统都在内核里有一些内建的函数库,这些函数能够用来完毕一些系统系统调用把应用程序的请求传给内核,调用对 ...
- 无缓存I/O操作和标准I/O文件操作区别
本文转载于:http://www.360doc.com/content/11/0521/11/5455634_118306098.shtml 首先,先稍微了解系统调用的概念: 系统调用,英 ...
- 文件I/O和标准I/O
转载:https://blog.csdn.net/kyang_823/article/details/79496561 一.文件I/O和标准I/O文件I/O:文件I/O也称为不带缓冲的I/O(unbu ...
- Linux文件操作学习总结【转载】
本文转载自: http://blog.csdn.net/xiaoweibeibei/article/details/6556951 文件类型:普通文件(文本文件,二进制文件).目录文件.链接文件.设备 ...
- php基础知识--文件操作
文件操作 文件 广义角度: 任何一个在磁盘上可以看到的符号(包含真正的文件及文件夹) 狭义角度: 真实存储数据的载体(不包含文件夹, 如doc文件,txt文件等) 文件操作: 对文件的增删改查 文件分 ...
随机推荐
- django基础窗口类的使用
django基础窗口form表单的运用 具体效果图如下: 首先确定表单中的数据集,先自己创建一个forms.py或者在原来的models.py中添加: 1代码如下 class ContactForm( ...
- python高级 之(二) --- 类装饰器
装饰器-初级 在不改变原有函数逻辑功能的基础上,为函数添加新的逻辑功能.使代码可读性更高.结构更加清晰.冗余度更低 简介 """ 闭包: 函数嵌套的格式就是闭包.写装饰器 ...
- C语言之联合体
联合union是一个能在同一个存储空间存储不同类型数据的类型 联合体所占的内存长度等于其最长成员的长度,也有叫做共用体 联合体虽然可以有多个成员,但同一时间只能存放其中一种 对于联合体来讲最基本的原则 ...
- 关于虚拟机docker 启动mysql 启动成功但未挂载到端口
首先排查了防火墙和其他权限相关问题 然后检查了mysql 用户权限问题 docker logs 查看日志 正常应该是到3306 问题是我的mysql my.cnf 文件是挂在在本地.当第二次启动容器时 ...
- java,mysql触发器,redis生成流水号(yyyyMM000)
最近又遇到需要根据日期生成流水号的业务,然后记录了几种生成方法,一个是通过java代码,一个是数据库的触发器,还有是通过redis.下面是代码: 通过java生成简易流水: /** * 通过日期和生成 ...
- leecode刷题(23)-- 合并两个有序链表
leecode刷题(23)-- 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2-> ...
- Linux内核、mysql内核、Tcp/Ip内核、java等知识书籍
LINUX <linux内核设计与实现>(2011年出版,链接:https://pan.baidu.com/s/107hriLNVt05A8egeU8Du-g 密码:0cgn) < ...
- MySQL两种内核对比
MySQL内核 https://blog.csdn.net/baichoufei90/article/details/83504446 关键字:全文索引 索引外置 两种内核:MyISAM 和InnoD ...
- Centos7:zookeeper安装,配置与使用
配置jdk环境 解压缩zookeeper的压缩包 配置 创建data目录 复制zoo_sample.cfg为zoo.cfg 修改confg/zoo.cfg中dataDir=**/data 常用命令 . ...
- JDBC1
---恢复内容开始--- create table `account` ( `id` ), `name` ), `balance` ) ); insert into `account` (`id`, ...