【常见Linux文件编程基础操作详解】

常见Linux文件编程基础操作详解



前言

下面分别从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下文件操作进行了简单的演示,对于这些常见的操作需要我们每个人都能熟练使用,对后面更复杂的操作时(进程 线程等)可以更好学习,嗯总之加油吧。

猜你喜欢

转载自blog.csdn.net/boybs/article/details/123035245
今日推荐