- 作者:老汪软件技巧
- 发表时间: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;
}