文件IO的学习
1.打开文件 open
2.读写文件 read\write
3.关闭文件 close
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
功能:打开文件并获取一个文件描述符
参数:
pathname:要打开的文件的文件名
flags:打开方式
O_RDONLY; 只读
O_WRONLY;只写
O_RDWR;可读可写
O_CREAT;创建文件
O_TRUNC;清空文件
O_APPEND;追加写
标准io 文件io
“r” O_RDONLY;
“r+” O_RDWR
“w” O_WRONLY| O_CREAT|O_TRUNC;0664
“w+” O_RDWR|O_CREAT|O_TRUNC; 0664
“a” O_WRONLY|O_APPEND|O_CREAT
"a+" O_RDWR|O_APPEND|O_CREAT
文件描述符:操作系统一打开文件的标识符
小的,非负的整形数据
范围:0-1023(共1024个)
分配原则:最小未被使用原则
标准IO:---》 FILE *---》FILE ---》int fd;
文件io:---》fd(文件描述符)
系统默认已将打开的三个文件占用了012这三个文件描述符:
标准io 文件io
FILE* int
stdio--》标准输入设备 0
stdout--》标准输出设备 1
stderr--》标准出错设备 2
int close(fd);
文件描述符泄漏:打开的文件使用完时没有关闭会导致泄漏。
ssize_t write(int fd, const void *buf, size_t count);
功能:向文件中写入数据
参数:
fd:文件描述符
buf:要写入数据的首地址
count:要写入的字节数
返回值:
成功:实际写入的字节数
失败:-1
以下代码是关于write函数的用法。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
int main()
{int fb = open("./1.txt",O_WRONLY| O_CREAT|O_TRUNC,0664);if(-1 == fb){printf("error\n");return -1;}char *p = "hello world";char s[32] = {"hello world"};write(fb,"hello world",11);write(fb,p,strlen(p));write(fb,s,strlen(s));close(fb);return 0;
}
ssize_t read(int fd, void *buf, size_t count);
功能:从文件中读取
参数:
fd:文件描述符
buf:存储数据的空间首地址
count:希望读取的字节
返回值:
成功:实际读到的字节数
失败:-1
读到文件末尾:0
以下代码是read函数的使用
在使用文件io实现cat功能或者实现文件拷贝功能时,如果文件过大一次性读写不完,时需要进行循环。
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
int main()
{int fb1 = open("/home/linux/include/stdio.h",O_RDONLY);if(0 > fb1){printf("error\n");return -1;}char buff[1024] = {0};while(1){ssize_t ret = read(fb1,buff,sizeof(buff));if(0 == ret){break;}if(-1 == ret){break;}write(1,buff,ret);}close(fb1);return 0;
}
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
int main(int argc,const char *argv[])
{if(argc<3){printf("usage ./a.out <fb> <fb2>");return -1;}int fb1 = open(argv[1],O_RDONLY);int fb2 = open(argv[2],O_WRONLY| O_CREAT|O_TRUNC,0664);if(-1 == fb1 || -1 == fb2){printf("error\n");return -1;}char buff[1024] = {0};
while(1){ssize_t ret = read(fb1,buff,sizeof(buff));if(0 == ret){break;}else if(-1 == ret){break;}write(fb2,buff,ret);}close(fb1);close(fb2);return 0;
}
lseek:
off_t lseek(int fd, off_t offset, int whence);
功能:文件读写位置定位
参数:
fd:文件描述符
offset:偏移量(字节)
whence(要偏移的相对位置)
SEEK_SET:文件开头位置
SEEK_CUR:文件当前读写位置
SEEK_END:文件末尾
返回值:
成功:返回当前读写位置到文件开头
失败:-1
求文件大小:
off_t len = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);//文件读写位置复位。
标准io:
1.属于c库函数,移植行强
2.标准io是系统调用的一次封装,增加了缓冲区,目的是提高数据读写的效率。
3.主要用于在普通文件的操作上
文件io:
1.属于系统调用,只用于linux操作系统,移植性弱。
2.文件io无缓冲区
3.文件io主要应用在对硬件的操作上,也可以操作普通文件
缓冲区:
1.行缓存 1k(1024字节)---》人机交互界面,终端
缓冲区被刷新的方法
1.程序结束自动刷新缓冲区。
2.遇到\n刷新。
3.fflush(强制刷新)
4.缓冲区满了自动刷新
2.全缓冲 4k(4096字节)---》文件缓冲区
1.程序结束自动刷新
2.fflush(强制刷新)
3.文件关闭刷新
4.缓冲区满了会刷新
3.无缓冲 0k ---》出错信息对应的设备。
stderr---》无缓冲
#include <stdio.h>
#include <time.h>int main(int argc, const char *argv[])
{FILE *fp = fopen("1.txt", "w");time_t sec;//time(&sec);sec = time(NULL);printf("sec = %ld\n", sec);char *ptm = ctime(&sec);printf("ptm = %s\n", ptm);struct tm *pt = localtime(&sec);printf("[%d-%d-%d %d:%d:%d]\n", pt->tm_year+1900, pt->tm_mon+1,pt->tm_mday,pt->tm_hour, pt->tm_min, pt->tm_sec);fprintf(fp, "[%d-%d-%d %d:%d:%d]\n", pt->tm_year+1900, pt->tm_mon+1,pt->tm_mday,pt->tm_hour, pt->tm_min, pt->tm_sec);fclose(fp);return 0;
}