文件操作
文件在操作系统中以页块大小来存储,不论多少字节 起始是4k,超4k变为8k
file是一个文件操作结构体,当需要对文件进行操作时,需要定义一个文件操作指针
打开文件
打开文件函数原型:FILE* fopen ( const char * filename, const char * mode );
filename:路径,如果没有文件夹会报错
mode:读写方式
int main()
{
FILE* fp=fopen("d:\\fxl.txt","w");
}
读写文件
fprinf(fp,"%d ",ar[i]);//ASCII码输出到fp中 itoa函数
fscanf(fp,"%d",&br[i];//写入到br中 用到itoa函数,扫描到不是数字字符就停止
//当用,分割时
fscanf(fp,"%d,",&br[i])//应加,写入时会把,当做格式一部分,使得下次读取fp时是在数字上而不是,上
atoi() 函数会扫描参数 str 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(’\0’)才结束转换,并将结果返回。
所以用,等除了空白字符(例如空格,tab缩进)以外的其他符号,应严格按照格式来进行格式化写入
二进制文件的读写
:size_t fwrite ( const void * ptr, size_t size, size_t count,FILE * stream );
ptr:这是指向要被写入的元素数组的指针。
size:这是要被写入的每个元素的大小,以字节为单位。count:这是元素的个数,每个元素的大小为size字节。
stream:这是指向FILE对象的指针,该FILE对象指定了一个输出流。
在内存中什么形式就是按什么形式写进去 int a=1;在内存中是01000000(小端) 所以在读的时候要按照整形大小来偏移
关闭文件
文件位置
long ftell ( FILE *stream ) ;返回当前文件位置,字节为单位
fpos_t fgetpos( FILE *stream,fpos_t *ps) fpos_t为64位int 功能与上相同
int fseek( FILE*stream, long offset, int origin ); 执行成功0
设置文件流stream 的文件位置指示器为offset所指向的值。
1)若stream 以二进制模式打开,则新位置准确地是文件起始后(若origin为SEEK SET)或当前文件位置后(若origin为SEEK_CUR ),或文件结尾后(若origin为SEEKEND)的offset字节。不要求二进制流支持SEEK_END,尤其是是否输出附加的空字节。
2)若stream以文本模式打开,则仅有的受支持offset值为零(可用于任何origin)和先前在关联到同一个文件的流上对ftell的调用的返回值(仅可用于SEEK_SET的origin ).
3)若stream为宽面向,则一同应用对文本和二进制流的限制(允许ftell的结果与SEEK_SET一同使用,并允许零offset以SEEK_SET和SEEK_CUR但非SEEK_END为基准)。
除了更改文件位置指示器,fseek还撤销ungetc的效果并清除文件尾状态,若可应用。若发生读或写错误,则设置流的错误指示器( ferror )而不影响文件位置.
stream:要修改的文件流
offset:相对origin迁移的字符数
origin: offset所加上的位置。它能拥有下列值之一: SEEK_SET、SEEK_CUR、SEEK_END
int feof( FILE*stream );
//通过ftell和fseek获取字节数
fseek(pf,0,SEEK_END);
int len=ftell(pf);//如果以文本形式打开,会把回车统计成两个字节,载入缓冲区时会合并为一个,所以获得的长度是比实际长度长
//二进制不会
fgetc getc从文件流获取一个字符
fgets从文件流获取一个字符串
fputc putc将一个字符写入文件流
fputs将一个字符串写入文件流
getchar从stdin读取一个字符
gets(C11中移除)
gets_s从stdin读取一个字符串
putchar将一个字符写入stdout
puts将一个字符串写入stdout
ungetc将一个字符送回文件流
getchar()从缓冲区读取一个字符
char cf;
cf=getchar();
//如果输入1回车,那么从标准输入设备输入的数据载入缓冲区就有1+回车这两个数据,读取完1之后还会有回车的ascii在缓冲区中
//若缓冲区没有数据会从标准输入设备输入
辨析
getchar_s()到回车符停止 scanf_s到空格停止,都是从缓冲区读取
puts相当于printf("%s \n",str);
int feof( FILE*stream );和fgetc getc fgets:
getc在读到txt文档最后一个字符的时候,fp指向最后一个字符,读出字符后,fp向后移,fp指向EOF,进行下一次循环,feof判断是否到达文档末尾:由于上一次fgetc读出的是文档最后一个字符,所以即使fp当前已经指向了EOF,feof函数还是会返回假,这样循环就又继续了,下一次循环中,就会将fp指向的EOF输出,fp后移(已经到达文档尾,无法后移);
fgets遇到文件尾指示器时不改变 str
所指向数组的内容