• 作者:老汪软件技巧
  • 发表时间:2024-01-04 04:00
  • 浏览量:

文章目录

linux下的文件操作包括两种,一种是使用C函数,一种是使用系统调用。

文件操作函数

文件操作函数包括fopen、fgetc、fputc函数等,这是标准的C函数

// 把file.in中给的内容输出给file.out
#include
#include
int main(){
	int c;
	FILE *in,*out;//定义两个文件指针类型
	in=fopen("file.in","r");//以只读的方式打开file.in文件,成功后返回文件指针in
	out=fopen("file.out","w");//以只写的方式打开file.out文件,成功后返回文件out
	while((c=fgetc(in))!=EOF)//从in文件中读,把读出来的数据写到out中
		fputc(c,out);
	fclose(in);
	fclose(out);
	exit(0);
}

char *fgets(char *s,int size,FILE *)表示从指定的文件中读下一个字符,返回一个没有符号的字符,或者EOF(end of file),需要读的文件必须是读或者读写的方式打开的,并且文件存在。

fputc(char c,FILE * fp)把内容写入到指定文件。

可以使用diff file.in file.out比较两个文件的内容,没有输出表示两个文件一模一样。

,最重要的是把文件从内存中写回磁盘。

为了程序的健壮性,可以把以上的文件改为以下,防止读的文件没有权限或者不存在

// 把file.in中给的内容输出给file.out
#include
#include
int main(){
	int c;
	FILE *in,*out;//定义两个文件指针类型
	if((in=fopen("file.in","r"))==NULL){//以只读的方式打开file.in文件,成功后返回文件指针in
		print("file.in文件不存在!")
		return 0;
	}
	out=fopen("file.out","w");//以只写的方式打开file.out文件,成功后返回文件out
	while((c=fgetc(in))!=EOF)//从in文件中读,把读出来的数据写到out中
		fputc(c,out);
	
	exit(0);
}

文件系统调用

文件描述符以及open、read、write

#include
#include
#include
#include
int main(){
	char block[1024];
	int in,out;
	int nread;
	
	if((in=open("file.in",O_RDONLY))==-1){// 3
		print("文件打开错误!");
		return 0;}
	out=open("file.out",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);// 4
	while((nread=read(in,block,sizeof(block)))>0)
		write(out,block,nread);
	return 0;
}

mode的值包括以下

linux下任何一个进程都有3个默认打开的文件描述符:0表示标准输入(键盘),1表示标准输出(显示器),2表示标准错误输出(显示器)

系统调用与标准函数c的调用的区别

使用time 文件路径,可以知道文件运行所需要的时间

使用 文件路径,可以跟踪文件

文件的读取位置 标准c函数

标准的c函数中,不可以对FILE的文件指针直接进行++,–,可以使用fseek函数来控制文件的读写指针。

fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;

fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;

(fp,-100L,2);把fp指针退回到离文件结尾100字节处。

系统调用

系统调用使用lseek来调用文件的文件位置,与c函数调用相比,c文件调用使用的是文件指针,而系统调用使用的是文件描述符号

空洞文件

可以使用以上的fseek和lseek去创建一个空洞文件

① 空洞文件就是这个文件有一段是空的;

② 普通文件中间不能有空,write文件时从前往后移动文件指针,依次写入;

③ 用lseek往后跳过一段,就形成空洞文件;

④ 空洞文件对多线程共同操作文件非常有用。需要创建一个很大文件时,从头开始依次创建时间很长,可以将文件分成多段,多个线程操作每个线程负责其中一段的写入。

文件的内存映射操作

#include
#include
#include
#include
#include
typedef strucy{
	int integer;
	char string[24];
}RECORD;
#define NRECORDS(100)
int main(){
	RECORD record,*mapped;
	int i,f;
	FILE *fp;
	
	fp=fopen("records.dat","w+");
	for(i=0;i

文件目录

文件目录对应的是文件的属性信息,FCB文件控制块,存放文件的属性信息;文件的属性信息与文件的实体不是存在在一个位置上的,把文件的属性信息存放在一个位置,这一类的文件叫做目录文件,也就是上的文件夹

#include
#include
#include
#include
#include
#include
void printdir(char *dir,int depth){
	DIR *dp;
	struct dirent *entry;
	struct stat statbuf;
	if((dp=opendir(dir))==NULL){
		fprintf(stderr,"cannot open directory:%s\n",dir);
		return;
	}
	chdir(dir);
	while((entry=readdir(dp))!=NULL){
		lstat(entry->d_name,&statbuf);
		if(S_ISDIR(statbuf.st_mode)){
			if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
				continue;
		printf("%*s%s/\n",depth,"",entry->d_name);
		printdir(entry->d_name,depth+4);//递归调用,深度优先搜索
		}
		else printf("%*s%s\n",depth,"",entry->d_name);
	}
	chdir("..");
	closedir(dp);
}
int main(){
	printf("Directory scan of /home:\n");
	printdir("/home",0);
	printf("done\n");
	return 0;
}