文件
什么是文件:储存在外部介质上具有名字(文件名)的一组相关数据的集合
文件的作用:保存数据
文件的格式:通过后缀来说明是什么类型,有doc、rmvb、jpg、mp3等类型
文件分类:文本文件和二进制文件
文本文件:保存的时候,每一个字符对应一个字符
二进制文件:按照二进制编码保存的文件
Linux不区分二进制文件和文本文件
文件信息:
每一个被使用的文件的信息都存在一个结构体FILE中
打开文件&&关闭文件
FILE *fp//定义文件指针
//fopen("文件名","打开文件方式");//打开文件
fclose(fp);//关闭文件
文件打开方式 含义 如果该文件不存在
“r”(只读) 以只读的形式打开文本文件
“w”(只写) 以只写模式建立文本文件,若文件存在,则文件长度清零
“a” (追加) 以追加的模式(从文件末尾处开始的只写模式)打开或建立文本文件
“r+”(读写) 以更新(读写)模式打开文本文件
“w+”(读写) 以更新模式建立文本文件,若文件存在则文件清零
“a+”(读写) 以追加(从文件末尾处开始写入的更新模式)模式打开或建立文本文件
rb、wb、ab…(末尾加d的,皆为打开二进制文本文件)
fgetc函数:
调用形式:fgetc(fp)
功能:从fp指向的文件中读入一个字符
返回值:读成功,返回所读的字符;失败则返回结束标志EOF(即 -1)
#include <stdio.h>
int main()
{
char a;
char c;
FILE *fp;
//打开文件
fp=fopen("C:\\Users\\86170\\Desktop\\98+8+.txt","r");
if(fp==NULL){
printf("\a打开失败\n");
return 0;
}
/*a=getchar();
while(a!='\n'){//回车代表结束
//将a写入文件之前,会清空文件内容
fputc(a,fp);
a=getchar();
}*/
c=fgetc(fp);
while(c!=EOF){
putchar(c);
c=fgetc(fp);
}
//关闭文件;
fclose(fp);
return 0;
}
运行结果:
fputc函数:
调用形式:fputc(ch,fp)
ch为要写入的字符,fp为文件指针。
功能:把字符ch写入到文件指针变量fp所指的文件中
返回值:(写成功)返回值就是输出的字符;(输出失败)返回EOF
#include <stdio.h>
int main()
{
char ch;
FILE *fp;
//打开文件
fp=fopen("C:\\Users\\86170\\Desktop\\98+8+.txt","wt+");
//判断其文件是否打开成功
if(fp==NULL){
printf("\a打开失败\n");
return 0;
}
//写入前会清空文件
while((ch=getchar())!='\n'){ //回车代表结束
fputc(ch,fp);
}
//关闭文件;
fclose(fp);
return 0;
}
运行结果:
字符串的读写
fgets函数
调用形式:fgets(str,n,fp);
str:数组名,n:字符个数,fp:文件指针
功能:从fp指向的文件读入长度为(n-1)的字符串,存放到字符数组str中
返回值:读成功,返回地址str,失败则返回NULL
fputs函数
调用形式:fputs(str,fp)
str:数组名,fp:文件指针
功能:str所指向的字符串写到文件指针变量fp所指向的文件中
返回值:写成功,返回0,否则返回非0值
批量数据化的读写
用二进制方式向文件读写一组数据
一般调用形式:
fread(buffer,size,count,fp);
//fread是用来存放从文件读入的数据的储存区的地址(从文件中读取数据)
fwrite(buffer,size,count,fp);
//fwrite是要把此地址开始的存储区中的数据向文件输出(向文件中写入数据)
buffer: 将文件中的数据读取到该缓冲区中,通常为数组名
size :要读的字节数(sizeof(int),sizeof(char))
count:要读写多少个数据项
fp :文件指针
feof()的原理:
feof()函数,并不是通过读取到文件的EOF来评判,这个文件是否为空。
对feof()来说,它的工作原理是,站在光标所在位置,向后看看还有没有字符。如果有,返回0;如果没有,返回非0。它并不会读取相关信息,只是查看光标后是否还有内容。
直接使用时的错误分析:
对于一个空文件来说,当程序打开它的时候,它的光标会停在文件的开头,但是由于文件里什么内容都没有存(但是EOF是存在的),即整个文件就存贮了一个EOF。当程序打开文件,并直接调用feof()时,这个函数就会站在光标的位置向后张望,结果就看见了EOF,然后就当然返回0了。
rewind(fp);//文件位置指针回到文件开头
int fseek( FILE *stream, long offset, int origin );
功能:重定位流上的文件指针指向的位置
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把fp指针退回到离文件结尾100字节处;