C语言文件读写


前言

提示:在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

总结

1、读取文件文本和写入文件文本应该分开封装,如果文件打开后,写入文件,然后在读取文件,很容易出现问题(如果写入文件长度为4,但是读取长度为8,则文件后面会追加4个空格)。 2、在windows下,文本文件打开文件\n换行,会自动在前面加入\r,但是二进制打开不会。 3、在使用fread读取文件,并且显示时,一次读取的大小要小于buf的定义的大小,不然,会出现越界,不能自动追加'\0'结尾,但是如果是文件复制,则可以。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值