文件相关操作
在C语言中除了文件的读写操作之外,还有如下一些有关文件的其它操作:
11.6.1 rewind
在文件进行读写操作的时候,有一个叫当前读写位置的指针,用来记录文件当前读写的位置。可以通过rewind()函数或者fseek()函数来移动文件的当前读写位置指针。
rewind(fp);//首部
执行完上面的函数后,会将文件fp当前的读写位置移动到文件的开头位置。
将文件当前读写位置移动到最开始的地方。等同于:
fseek(fp,0,0);
11.6.2 fseek
fseek()函数用于更灵活的移动文件当前的读写位置指针。它有三个参数,第一个参数是被打开文件的指针,第二个参数是移动的偏移,偏移值可以为正或者为负,第三个参数是代表第二个参数的偏移相对于什么位置。比如:
fseek(fp,50,SEEK_CUR);
那么就是将文件的读写指针移动到当前位置后面50个字节。而SEEK_SET则是相对于文件开头,SEEK_END是文件结尾。比如
fseek(fp, -50, SEEK_END);
就是将文件读写指针移动到距离文件结束50个字节的位置。
下面是使用fseek()函数来移动文件读写指针的一个例子:
int seek_demo()
{
//打开或者创建文件
char *path = "h:\\doc\\new.txt";
FILE *fp1 = NULL;
errno_t err;
err = fopen_s(&fp1,path,"w");
if(fp1==NULL || err != 0)
{
printf("Open file failed\n");
return -1;
}
//基于fp1这个指针,对文件进行读写等操作
char buff[]="hello world";
fwrite(buff,sizeof(buff),1,fp1);
//rewind(fp1);
fseek(fp1,-5,SEEK_CUR);
int data = 0x10;
fwrite(&data,sizeof(data),1,fp1);
fclose(fp1);
//读数据
err = fopen_s(&fp1,path,"r");
if(err!=0)
{
return -1;
}
data = 0;
memset(buff,0,sizeof(buff));
fread(buff,sizeof(buff),1,fp1);
printf("buff:%s\n", buff);
fread(&data,sizeof(data),1,fp1);
printf("data:0x%x\n",
data);
fclose(fp1);
return 0;
}
11.6.3 feof
在读文件的时候,当文件的当前位置到达文件末尾,就不能继续读数据了。函数feof()就是用来判断文件当前位置是否达到文件末尾,如果到达,就返回真,否则为假。
下面是一个使用feof()来读文件的例子:
int read_ini()
{
char *file="h:\\doc\\config.ini";
FILE *pfile = NULL;
errno_t err = fopen_s(&pfile,file,"r");
if(err !=0 ||pfile == NULL)
{
return -1;
}
while(!feof(pfile))//如果文件当前读写位置没有到达结尾,就继续读
{
char buff[1024]={0};
fgets(buff,1024,pfile);
printf("%s",buff);
}
printf("\n");
fclose(pfile);
return 0;
}
11.6.4 rename/remove/mkdir
文件的重命名,删除,创建文件夹都是与文件有关的一些基本操作。下面一一介绍C语言里这些函数的调用方式:
1,重命名文件:
void rename_file()
{
//将文件1.txt重命名为2.txt
char *src="h:\\doc\\1.txt";
char *dst="h:\\doc\\2.txt";
rename(src,dst);
}
2,删除文件
void delete_file()
{
char *del_file = "h:\\doc\\test.dat";
remove(del_file);
}
3,创建文件夹
int create_dir()
{
//创建文件夹
char *dir = "h:\\doc\\test\\x";
int res = _mkdir(dir);//注意,创建不能递归完成,h:\doc\test必须已经存在,否则函数会失败
if(res==-1)
{
printf("create dir failed\n");
return -1;
}
return 0;
}
11.6.5 ftell
函数ftell()用于获取文件读写指针的当前位置。可以结合fseek()函数来计算文件的大小,代码如下:
static long getfilesize(char *szFile)
{
long size = 0;
if (szFile == NULL)
{
return 0;
}
FILE *fp;
if((fp=fopen(szFile,"r"))==NULL)
return 0;
fseek(fp,0,SEEK_END);//首先将文件读写指针移动到文件结尾
size = ftell(fp); //获取文件读写指针的当前位置,即为文件大小;
fclose(fp);
return size;
}