文件操作
- open
- read
- write
- lseek
- fopen
- fread
- fwrite
- fseek(与seek用法相同)
1. open()文件打开
函数原型: int open(const char *pathname, int flags);
打开或者创建文件需要下面3个头文件(查询头文件可在Liunx下使用 man 2 open查找,不需要强行记下)
并且 open的返回值为 int 型
int fd;//文件描述符
fd = open("./file1",O_RDWR);
文件名 ,打开方式可读可写(第二张图)
代码示例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
int fd;
fd = open("./file1",O_RDWR);
if (fd == -1)//打开文件若失败返回值为-1 在man手册中可以进行查询
{
printf("open file1 failed \n");
fd = open("./file1",O_RDWR|O_CREAT,0600);//O_CREAT是创建文件的意思 0600为创建文件的允许位
if(fd>0)
{
printf("creat file1 success\n");
printf ("file1 =%d\n",fd);
}
}
return 0;
}
2. wirte()文件写入
原型: ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符
buf:写入文件的内容
count:写入文件的大小
代码示例(见下一个read中的示例,write和read结合)
3.read()文件读取
函数原型 ssize_t read(int fd, void *buf, size_t count)
fd:文件描述符
buf:将fd里面的内容读到buf里面
count: 读取内容的大小
代码示例:
int main()
{
int fd;
char *buf="xxxxxxx";//内容自己定义
fd = open("./file1",O_RDWR);
if (fd == -1)
{
printf("open file1 failed \n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd>0)
{
printf("creat file1 success\n");
}
}
printf ("file1 =%d\n",fd);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1)
{
printf("write %d to file1 success\n ",n_write);
}
close(fd);//关闭文件
fd = open("./file1",O_RDWR);//重新打开该文件,为了使光标回到初始的位置,正常直接使用lseek函数即可(seek的使用方法将在下面介绍);
char *readBuf;
readBuf=(char *)malloc(sizeof(char)*n_write+1);//初始化readBuf这个指针,为了防止内存不够所以需要在n_wirte的基础上加1;
int n_read = read(fd,readBuf,n_write);
printf("%d,contxet:%s\n",n_read,readBuf);
close(fd);
return 0;
}
结果示例:
4.lseek()文件光标的位置改变
函数原型 off_t lseek(int fd, off_t offset, int whence);
off_t offset:偏移值(一般情况为0)
seek-set :开始位置
seek-cur:当前位置
seek-end:结束位置
lseek(fd,0,SEEK_SET);//直接把光标移到开始的位置(代替这个↓),就不需要再关闭文件然后打开文件,这种略显憨憨的操作了
运用以上函数我们可以写一个自己的cp文件
代码示例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int fdSrc;
int fdDes;
char *readBuf;
if (argc != 3)
{
printf("pro errro\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
int size = lseek(fdSrc,0,SEEK_END);
readBuf = (char *)malloc(sizeof(char)*size +8);//开辟大小为一个char型的大小*一个文件的大小 在+8防止内存不够
lseek(fdSrc,0,SEEK_SET);
int n_read = read(fdSrc,readBuf,size);
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
int n_write = write(fdDes,readBuf,strlen(readBuf));
close(fdSrc);
close(fdDes);
return 0;
}
结果示例:
5.fopen()基于c自带的文件打开方式
FILE *fopen(const char *path, const char *mode);函数原型
FILE *fp;//文件描述符
fp =fopen("./chenxinbo.txt",“w+”);
6.fread()基于c自带的文件读取方式
函数原型
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
void *ptr:指向要读取的数组中首个对象的指针,将数据读到这里
size_t size, size_t nmemb: 每个对象的大小(单位是字节)
size_t nmemb:要读取的对象个数
FILE *stream :输入流 为上面的fp
7.wirte()基于c自带的文件写入方式
函数原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
const void *ptr:是一个指针,对fwrite来说,是要获取数据的地址
size_t size:要写入内容的单字节数
ize_t nmemb:要进行写入size字节的数据项的个数;
FILE *stream :输入流 为上面的fp
代码示例(包括fopen(),fread(),fseek()):
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char *str = "xxxxxxx";
char readBuf[128]={0};
fp =fopen("./xxx.txt","w+");
fwrite(str,sizeof(char),strlen(str),fp);
fseek(fp,0,SEEK_SET);
fread(readBuf,sizeof(char),strlen(str),fp);
printf("this text is :%s\n",readBuf);
return 0;
}