目录
1.C语言文件IO相关操作(库函数IO接口)
fopen--打开文件,返回一个文件的操作句柄,有了句柄才能对指定的文件进行操作。
FILE *fopen(char *pathname, char *mode);
参数说明:
pathname:文件的路径
mode:文件的打开方式
r 只读打开(文件不存在会报错)
w 只写打开(文件不存在则创建,存在则截断长度为0,丢弃原有内容)
a 追加写打开(文件不存在则创建,存在则写入数据总是写入到文件末尾)
r+ 读写打开(文件不存在会报错)
w+ 读写打开(文件不存在则创建,存在则截断长度为0,丢弃原有内容)
a+ 读写打开(文件不存在则创建,存在则写入数据总是写入到文件末尾)
b 以二进制形式打开(默认不使用b,则使用的是文本方式打开,对一些特殊字符的处理有区别,例如:\n->\r\n)以文本形式打开文件,有可能会造成读到的数据与文件实际的数据有差别。
fwrite--向文件写入数据
size_t fwrite(char *data,int bsize, int nmem,FILE *fp);
参数说明:
data:指向保存读写数据的内存的指针,可以指向数组,变量,结构体等
bsize:表示每个数据块的字节数
nmem:表示要读写的数据块的个数
fp:表示文件指针
fread--从文件中读取数据
size_t fread(char *buf,int bsize,int nmem,FILE *fp);
fclose--关闭文件
int fclose(FILE *fp);
fseek--跳转当前的读写位置
int fseek(FILE *fp, int offset, int whence)
参数说明:
whence:文件读写位置的起始偏移位置
SEEK_SET 文件的起始位置
SEEK_CUR 当前的读写位置
SEEK_END 文件的末尾位置
实例:
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp=fopen("./bite.txt","w+");//以读写的方式打开一个文件
if(fp==NULL){
perror("fopen errror");
return -1;
}
char *data="linux so easy!";
size_t ret=fwrite(data,1,strlen(data),fp);//向文件中写入数据
if(ret!=strlen(data))
{
perror("fwrite error");
fclose(fp);
return -1;
}
fseek(fp,0,SEEK_SET);//由于前边w+打开文件写入数据读写位置变到文尾,因此将当前的读写位置跳
// 转到文首
char buf[1024]={0};
ret=fread(buf,1,1023,fp);//从文件中读取数据
if(ret==0)
{
if(feof(fp))
{
printf("end of file");
}
if(ferror(fp))
{
perror("fread error");
fclose(fp);
return -1;
}
}
printf("%s\n",buf);//在标准输出中打印读到的数据
fclose(fp);//关闭文件
return 0;
}
结果:
2. 系统调用IO接口
接口:open write read Iseek close
int open(char *pathname, int flag, int mode);--打开文件
参数说明:
pathname:要打开的文件路径名
flag:文件的打开方式,打开方式决定了能够对文件进行什么样的操作
必选项:O_RDONLY(只读) O_WRONLY(只写) O_RDWR(读写),只能选择其一,不能同时使用
可选项:O_CREAT -文件不存在则创建 O_TRUNC -截断文件,丢弃原有数据
O_APPEND -追加写
例"w+" -- O_RDWR|O_CREAT|O_TRUNC
mode:当O_CREAT被使用时,就一定要设置第三个参数mode--用于设定被创建文件的访问权限0664
0664 --需要特别注意,前边的0不能省略,会涉及到特殊权限位的设置
给定的权限不一定是实际得到的权限,实际的文件权限会受到umask的影响
实际得到的权限:给定的权限&(~umask)
返回值:成功返回文件描述符fd,失败返回-1
ssize_t write(int fd, char *buf,size_t len);--向文件中写入数据
参数说明:
fd:open打开文件时返回的操作句柄--文件描述符
buf:要写入文件的数据的所在空间首地址
len:要写入的数据长度(以字节为单位)
返回值:成功返回实际读取到的数据长度;失败返回-1
ssize_t read(int fd, char *buf,size_t len);--从文件中读取数据
参数说明:
fd:open打开文件时返回的文件描述符
buf:一开空间的首地址,用于存放读取到的数据
len:要读取的数据长度(这个长度不能大于buf空间的大小,避免越界)
返回值:成功返回实际读取到的数据长度;0表示读到了文件末尾;失败返回-1
off_t Iseek(int fd, off_t offset, int whence);--跳转当前读写位置
参数说明:
fd:文件描述符
offset:偏移量
whence:偏移起始位置 SEEK_SET; SEEK_CUR; SEEK_END;
返回值:当跳转后,读写位置相对于文件起始位置的偏移量
int close(int fd);--关闭文件
参数说明:
fd:文件描述符
实例:
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
int main()
{
int fd=open("./bite.txt",O_CREAT|O_RDWR|O_TRUNC,0664);
if(fd<0)
{
perror("open error");
return -1;
}
char *data="i like linux!";
ssize_t ret=write(fd,data,strlen(data));
if(ret<0)
{
perror("write error");
close(fd);
return -1;
}
lseek(fd,0,SEEK_SET);
char buf[1024]={0};
ret=read(fd,buf,1023);
if(ret<0)
{
perror("read error");
close(fd);
return -1;
}
printf("%s\n",buf);
close(fd);
return 0;
}
结果: