常见Linux文件编程基础操作详解
文章目录
- 常见Linux文件编程基础操作详解
- 前言
- 一、文件编程概述
- 二、文件打开与创建
- 三、文件的写入、读取
- 五、文件光标移到操作
- 六、文件操作小应用cp指令实现
- 七、写整数与结构体到文件
- 八、标准c库对文件的操作
- 总结
前言
下面分别从linux 下文件的打开读写 关闭和标准c库下的打开读写关闭进行简单演示
linux下open read write lseek close
标准c库fopen fread fwrite fseek fclose
一、文件编程概述
linux下的文件操作总的可以分为打开 、读取、写入三大类 ,其他的相关操作都是基于打开读写后来实现,下面也会用具体的demo来实现不同参数的传入,当然对文件操作中还会有许多其他需要注意的小细节,譬如打开文件时的权限,各个不同参数的含义等等。
在下面的demo中并没有将所有情况都来实现,大家可以根据自己来进行不同的实验,所有操作都大同小异。
对使用不同函数时我们可以在linux下进行man 手册来查看,对我个人来说的话,并不会刻意去记各个函数,掌握一些简单的即可,其他的在使用的时候我们在去查看,对每个参数的含义进行理解,然后用不同的小demo进行试验。
二、文件打开与创建
各操作函数原型
int open(const char *pathname, int flags);
int close(int fd);
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(void)
{
int fd = 0; //文件返回描述符
fd = open("./text",O_RDWR); //在当前目录下以可读可写的方式打开
if(fd == -1) //打开失败返回-1 成功返回一个文件流
{
printf("open error\n");
//可读可写 如果没有存在text文件则创建一个 0600 表示可读可写 4(可读) 2(可写) 1(可执行)
fd = open("./text",O_RDWR | O_CREAT,0600);
if(fd > 0)
{
printf("creat file success\n");
}
}
else
{
printf("open success\n");
}
close(fd); //操作完成关闭文件描述符
return 0;
}
}
运行结果
三、文件的写入、读取
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd = 0; //接收文件描述符
char writebuf[]="xiao yin student";
char readbuf[128] = {0}; //读取缓冲
int n_write = 0,n_read = 0; //读写大小返回
fd = open("./text",O_RDWR); //以可读可写方式打开当前目录下text文件
if(fd == -1)
{
printf("open error\n");
}
printf("fd = %d\n",fd); //将文件返回描述符打印出来
n_write = write(fd,writebuf,sizeof(writebuf)); //接内容写入
if(n_write != -1)
{
printf("write %d byte to file\n",n_write);
}
n_read = read(fd,readbuf,n_write); //将文件读取到readbuf
if(n_read != -1)
{
printf("read %d byte to readbuf\n",n_read);
printf("readbuf = %s\n",readbuf);
}
close(fd); //关闭
return 0;
}
从上面试验的结果可以看出与我们想象的不一样,这是因为当我们第一次将文件内容写入的时候,文件的光标已经移到了末尾,然而我们在次进行读取的时候,还是从该末尾进行读取,所以根本不会读取到我们写入的内容。在下一个demo中我们会进行光标的移到的讲解,可以再次查看本次实验的结果。
五、文件光标移到操作
光标函数原型
这里就只进行该函数的使用,各个参数大家可以自己进行查看
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd = 0; //接收文件描述符
char writebuf[]="xiao yin student";
char readbuf[128] = {0}; //读取缓冲
int n_write = 0,n_read = 0; //读写大小返回
fd = open("./text",O_RDWR); //以可读可写方式打开当前目录下text文件
if(fd == -1)
{
printf("open error\n");
}
printf("fd = %d\n",fd); //将文件返回描述符打印出来
n_write = write(fd,writebuf,sizeof(writebuf)); //接内容写入
if(n_write != -1)
{
printf("write %d byte to file\n",n_write);
}
//写完注意重新将光标置到开头,或者关闭重新打开 要不然读取不到数据
//close(fd);
//fd = open("./text",O_RDWR);
//将光标重新置到开头
lseek(fd,0,SEEK_SET);
n_read = read(fd,readbuf,n_write); //将文件读取到readbuf
if(n_read != -1)
{
printf("read %d byte to readbuf\n",n_read);
printf("readbuf = %s\n",readbuf);
}
close(fd); //关闭
return 0;
}
六、文件操作小应用cp指令实现
在linux下面我们会经常进行cp复制指令的使用,那么该指令具体该如何实现,下面我们用一个简单demo进行演示。
下面我们也会进行函数传参的使用,这在 后面我们学习中也会经常运用。
#include <stdio.h>
#include <error.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
char *ReadBuf = NULL;
int src = 0,des = 0; //源文件和目标文件的描述符
int file_size = 0; //文件读取的大小存储
//判断传入参数是否正确
if(argc != 3)
{
perror("param error\n");
exit(-1);
}
src = open(argv[1],O_RDWR); //以可读可写的 方式打开源文件
if(src == -1) //打开失败
{
printf("src file open failed\n");
}
//将源文件的内容读取到readbuf 缓冲区
file_size = lseek(src,0,SEEK_END); //读取文件大小
lseek(src,0,SEEK_SET); //将文件指针移值开头
ReadBuf = (char *)malloc(file_size*(sizeof(char)) + 8); //开辟缓冲空间大小
read(src,ReadBuf,file_size); //读取内容
//打开目标文件
des = open(argv[2],O_RDWR | O_CREAT,0600);
if(des == -1)
{
perror("des file open failed\n");
}
//将源文件内容读取到目标wenj
write(des,ReadBuf,file_size);
//关闭源文件
close(src);
close(des);
return 0;
}
七、写整数与结构体到文件
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
struct Data
{
int a;
char str[24];
};
int main(void)
{
int fd = 0;
struct Data dat1 = {100,"hello linux"};
struct Data dat2;
fd = open("./text",O_RDWR | O_CREAT,0600);
if(fd == -1)
{
printf("open error\n");
exit(-1);
}
write(fd,&dat1,sizeof(struct Data));
lseek(fd,0,SEEK_SET);
read(fd,&dat2,sizeof(struct Data));
printf("read data:%d %s\n",dat2.a,dat2.str);
close(fd);
return 0;
}
八、标准c库对文件的操作
在标准c库中对文件也有几个常见的操作为fopen fwrite fread fseek fclose和linux下的open write read lseek clsoe原理大致相同就是在使用的时候传参有点差异,下面也用具体的demo进行演示
一、fopen fwrite fread fclose
函数原型
FILE *fopen(const char *pathname, const char *mode);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
int fclose(FILE *stream);
pathname:文件名称
mode:文件操作权限
#include <stdio.h>
#include <string.h>
int main(void)
{
//FILE *fopen(const char *pathname, const char *mode);
FILE *fp;
char str[] = "my linux test";
char readbuf[128]= {0};
fp = fopen("./text","w+");
if(NULL == fp)
{
printf("fopen error\n");
}
//size_t fwrite(const void *ptr, size_t size, size_t nmemb,
// FILE *stream);
//文件写入
fwrite(str,sizeof(char),strlen(str),fp);
//将光标置到开始位置
fseek(fp,0,SEEK_SET);
//文件读取
// size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread(readbuf,sizeof(char),strlen(str),fp);
printf("read data:%s\n",readbuf);
//关闭文件描述符
fclose(fp);
return 0;
}
二、fputc fgetc feof
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
char c;
fp = fopen("./text","w+");
if(NULL == fp)
{
printf("fopen error\n");
exit(-1);
}
// int fputc(int c, FILE *stream);
//fputc('h',fp);
while(!feof(fp)) //feof 到达文件尾不为0
{
c = fgetc(fp);
printf("c = %c",c);
}
fclose(fp);
return 0;
}
三、结构体写入标准c库文件操作
#include <stdio.h>
#include <string.h>
struct Data
{
int a;
char name[24];
};
int main(void)
{
//FILE *fopen(const char *pathname, const char *mode);
struct Data dat = {100,"my linux"};
struct Data dat2;
FILE *fp;
fp = fopen("./text","w+");
if(NULL == fp)
{
printf("fopen error\n");
}
//size_t fwrite(const void *ptr, size_t size, size_t nmemb,
// FILE *stream);
//文件结构体写入
fwrite(&dat,sizeof(struct Data),1,fp);
//将光标置到开始位置
fseek(fp,0,SEEK_SET);
//文件读取
// size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread(&dat2,sizeof(struct Data),1,fp);
printf("read data:%d %s\n",dat2.a,dat2.name);
//关闭文件描述符
fclose(fp);
return 0;
}
总结
上面已经将Linux下文件操作进行了简单的演示,对于这些常见的操作需要我们每个人都能熟练使用,对后面更复杂的操作时(进程 线程等)可以更好学习,嗯总之加油吧。