文章目录
前言
提示:在C语言中,文件操作都是由库函数来完成的,下面总结下文件的相关操作。
一、文件的打开(fopen函数)
fopen()函数用来打开一个文件,它的格式为:
FILE *fopen(char *filename,char *type);
filename为文件名(包括文件路径),type为打开方式,它们都是字符串。fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个FILE类型的结构体变量中,然后将该变量的地址返回。如果接收 fopen() 的返回值,就需要定义一个 FILE 类型的指针。例如:
FILE *fp = ("demo.txt", "r");
打开方式(type)如表格所示:
类型 | 详解 |
---|---|
“r”(只读) | 为输入打开一个文本文件 |
“w”(只写) | 为输出打开一个文本文件 |
“a”(追加) | 为追加打开一个文本文件 |
“rb”(只读) | 为输入打开一个二进制文件 |
“wb”(只写) | 为输出打开一个二进制文件 |
“ab”(追加) | 为追加打开一个二进制文件 |
“r+”(读写) | 为读/写打开一个文本文件 |
“w+”(读写) | 为读/写创建一个文本文件 |
“a+”(读写) | 为读/写打开一个文本文件 |
“rb+”(读写) | 为读/写打开一个二进制文件 |
“ wb+”(读写) | 为读/写创建一个二进制文件 |
“ab+”(读写) | 为读/写打开一个二进制文件 |
在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。
代码如下(示例):
FILE *fp = NULL;
if(fp = fopen("D:\\test.txt","rb") == NULL) //判断打开的文件是否为空,如果为空,则提示错误
{
printf("open file is error D:\\test.txt file!\n");
exit(1);
}
二、文件关闭(fclose函数)
代码如下(示例):
if(fclose(fp) == 0) //文件关闭,如果成功则返回值为0,返回值为非0表示关闭错误
{
printf("close fp success\n");
}
else
{
printf("close fp fail\n");
}
三、C中文本文件和二进制文件的区别
二进制是按照二进制编码方式存放在文件中的,虽然可以在屏幕上显示,但是不能读懂,文本文件是ASC码,可以在屏幕上按字符显示。
四、C语言以字符形式读写文件
以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数:fgetc()和fputc()。fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。它的原型为:
int fgetc (FILE *fp); //fp 为文件指针。
fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。
代码如下(示例):
char ch;
while( (ch=fgetc(fp)) != EOF ) //每次读取一个字节,直到读取完毕
putchar(ch); //输出字符ch的值
fputc('a', fp); //想文本中输入字符a
EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回EOF时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()。
// feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是:
int feof ( FILE * fp ); //当指向文件末尾时返回非零值,否则返回零值。
// ferror() 函数用来判断文件操作是否出错,它的原型是:
int ferror ( FILE *fp ); //出错时返回非零值,否则返回零值。
五、C语言以字符串形式读写文件
fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的原型为:
char *fgets ( char *str, int n, FILE *fp ); //str 为字符数组,n 为要读取的字符数目,fp 为文件指针。
返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。读取到的字符串会在末尾自动添加 ‘\0’,n 个字符也包括 ‘\0’。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101。
代码如下(示例):
char str[N];
while(fgets(str, N, fp) !=NULL)
{
printf("str = %s",str);
}
六、C语言中的文件复制操作
#define N 101
FILE *wfp = NULL;
FILE *rfp = NULL;
if((wfp = fopen("D:\\test1.jpg","wb")) == NULL) //判断打开的文件是否为空
{
printf("open file is error D:\\test.txt file!");
exit(1);
}
if((rfp = fopen("D:\\1.jpg","rb")) == NULL) //判断打开的文件是否为空
{
printf("open file is error D:\\test.txt file!");
exit(1);
}
char buf[N]; //定义一个buf,作为缓存区
int len = 0; //读取的长度
while((len = fread(buf,sizeof(char),N,rfp))!=0)
{
fwrite(buf,sizeof(char),len,wfp);
}
fclose(wfp);
fclose(rfp);
七、C语言中文件常用的函数
fseek(fp,0,SEEK_END); //SEEK_END文件末尾,0偏移量.
fseek(fp,0,SEEK_SET); //SEEK_END文件头,0偏移量.
long filesize = ftell(fp); //返回当前的文件指针,相对于文件开头的位移量.
int ret = fprintf(fp,"%s","测试");//将文件格式化方式写入到文件中,成功返回字符串长度,错误返回负数.
int ret = feof(fp);//判断是否到文件尾部,如果是返回一个正数,不是返回0.
int ret = fflush(fp); //刷新文件缓存区,如果返回0,则表示成功,EOF表示失败,错误在error中.
rewind(fp);//设置文件流位置为开头,和fseek()一样.
long int ftell(FILE *stream);返回文件当前的位置
八 、文件加解密
通过字符串++和减减实现字符的加密和解密
void encrypt(char *s) //文件加密
{
while(*s)
{
(*s)++;
s++;
}
}
void disencrypt(char *s) //文件解密
{
while(*s)
{
(*s)--;
s++;
}
}
九、文件的重命名和删除
remove("E:\\Study\\program\\QT\\file\\a.txt");//删除文件a.txt
rename("E:\\Study\\program\\QT\\file\\b.txt","E:\\Study\\program\\QT\\file\\a.txt");//重命名b.txt为a.txt