C语言文件操作
从操作系统的角度来看,每一个与主机相连的输出输入设备都看作是一个文件。在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机的内存。这就要用到磁盘文件。C语言将文件看作是一个字符(字节)的序列,即一个一个字符(字节)的数据顺序组成。根据数据的组成形式,可分为ASCII文件和二进制文件。ASCII文件又称文本(text)文件,它的每一个字节可放一个ASCII码,代表一个字符。二进制文件是把内存中的数据按其在内存中的存储形式按原样输出到磁盘上存放。因而一个C文件就是一个字节流或二进制流。它把数据看作是一连串的字符(字节),而不考虑记录的界限。换句话说,C语言中文件不是由记录(record)组成的(这是和PASCAL或其他高级语言不同的)。在C语言中对文件的存取是以字符(字节)为单位的。输出输入的数据流的开始和结束仅受程序控制而不受物理符号(如回车换行符)控制。也就是说,在输出时不会自动增加回车换行符作为记录结束的标志,输入时不以回车换行符作为记录的间隔(事实上C文件并不是由记录构成的)。把这种文件称为流式文件。C语言允许对文件存取一个字符,这就增加了处理的灵活性。
文件结构体
FILE*fp;
打开文件,关闭文件
fopen() | FILE*fp=fopen(“XXX.txt”,“w”) ; |
---|---|
fclose() | fclose(fp); |
fopen(“路径+文件名”,“打开方式”);
- 打开方式:
-
文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
参数 | 意义 |
---|---|
r(read): | 读 |
w(write): | 写 |
a(append): | 追加 |
b(banary): | 二进制文件 |
+: | 读和写 |
**
文件操作函数:
**
函数名 | 意义 |
---|---|
fgetc(FILE *stream) | 从流中读取字符 |
fputc(int c, File *fp) | 将字符ch写到文件 |
fgets(buf,n,stdin) | C语言中从文件中获取字符串函数 |
fputs(str,fp); | 向指定的文件写入一个字符串 |
fscanf(FILEstream,constcharformat,[argument…]); | 格式化输入 |
fprintf (FILE* stream, const char*format, [argument]) | 传送格式化输出到一个文件中 |
fread ( void *buffer, size_t size, size_t count, FILE *stream) ; | 从文件流中读数据,最多读取count个项 |
fwrite(const void* buffer, size_t size, size_t count, FILE* stream); | 向指定的文件中写入若干数据块 |
int feof(FILE *stream);
feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
注意:feof判断文件结束是通过读取函数fread/fscanf等返回错误来识别的,故而判断文件是否结束应该是在读取函数之后进行判断。比如,在while循环读取一个文件时,如果是在读取函数之前进行判断,则如果文件最后一行是空白行,可能会造成内存错误。
int fseek(FILE *stream, long offset, int fromwhere);
重定位流(数据流/文件)上的文件内部位置指针
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。