[Explicação detalhada das operações básicas da programação de arquivos Linux comum]

Explicação detalhada das operações básicas da programação de arquivos Linux comum



prefácio

O seguinte é uma demonstração simples de abrir, ler, escrever e fechar arquivos no
linux e abrir, ler, escrever e fechar arquivos no linux
.


Uma visão geral da programação de arquivos

As operações de arquivo no linux podem ser geralmente divididas em três categorias: abrir, ler e escrever. Outras operações relacionadas são implementadas com base na abertura, leitura e escrita. As seguintes também usarão demonstrações específicas para implementar a entrada de diferentes parâmetros. Claro , Existem muitos outros pequenos detalhes que precisam ser observados na operação do arquivo, como as permissões ao abrir o arquivo, o significado de vários parâmetros e assim por diante.
Na demonstração a seguir, nem todas as situações são implementadas. Você pode realizar diferentes experimentos de acordo com você e todas as operações são semelhantes.
Ao usar funções diferentes, podemos verificar o manual do homem no linux. Para mim, não me lembro deliberadamente de cada função, apenas domino algumas simples. Entenda o significado de cada parâmetro e depois experimente diferentes pequenas demos.

insira a descrição da imagem aqui

2. Abertura e criação de arquivos

Protótipo de cada função de operação
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;
}
}

resultado da operação
insira a descrição da imagem aqui

3. Gravando e lendo arquivos

#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;
}

insira a descrição da imagem aqui

Pode-se ver pelos resultados do experimento acima que é diferente do que imaginamos, pois quando escrevemos o conteúdo do arquivo pela primeira vez, o cursor do arquivo se moveu para o final, mas quando leia-o da próxima vez, ele ainda será lido desse lado, então o que escrevemos não será lido. Na próxima demonstração, explicaremos o movimento do cursor e você poderá visualizar novamente os resultados desse experimento.

5. Mova o cursor do arquivo para a operação

O protótipo
da função de cursor é usado apenas aqui, e você mesmo pode verificar os parâmetros

insira a descrição da imagem aqui

#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;
}

insira a descrição da imagem aqui

Seis, implementação de instruções cp do applet de operação de arquivo

No Linux, muitas vezes usaremos a instrução cp copy, então como implementar essa instrução, vamos demonstrar com uma demonstração simples.
A seguir, também usaremos a transferência de parâmetros de função, que será usada com frequência em nosso aprendizado posterior.

#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;
}

insira a descrição da imagem aqui
insira a descrição da imagem aqui

7. Gravar inteiros e estruturas em arquivos

#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;
}

insira a descrição da imagem aqui

Oito, operação padrão de biblioteca c de arquivos

Existem também várias operações comuns em arquivos na biblioteca c padrão: fopen fwrite fread fseek fclose e open write read lseek clsoe no linux.

一、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);

insira a descrição da imagem aqui

pathname:
modo de nome de arquivo: permissões de operação de arquivo

#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;
}

insira a descrição da imagem aqui

二, 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;
}

Terceiro, a estrutura é gravada na operação padrão do arquivo da biblioteca 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;
}

insira a descrição da imagem aqui


Resumir

As operações de arquivo no Linux foram brevemente demonstradas acima. .

Acho que você gosta

Origin blog.csdn.net/boybs/article/details/123035245
Recomendado
Clasificación