文件分为数据文件和程序文件
数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。
程序文件
包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。
根据数据的组织形式,数据文件被称为文本文件或者二进制文件
文本文件
要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件
二进制文件
数据在内存中以二进制的形式存储,如果不加转换的输出到外存
C语言操作主要依靠文件指针中存放文件中的相关信息,C语言有系统声明的结构体FILE
通过文件指针,也可以称为文件句柄,通过文件指针能够访问与它关联的文件。
所以想操作文件,先要用文件句柄打开文件
FILE* fp = fopen ( const char * filename, const char * mode );
fp就是文件指针,用它来打开一个文件流。
filename就是要打开的文件名,文件名包括文件所在路径。
mode就是要打开文件的方式。
文件打开方式 | 含义 | 文件不存在时 |
---|---|---|
"r"只读 | 输入数据,打开一个已经存在的文本文件 | 出错 |
"w"只写 | 输出数据,打开一个文本文件 | 创建新文件 |
“a”追加 | 向文本文件尾添加数据 | 出错 |
“rb”二进制读 | 为了输入数据,打开一个二进制文件 | 出错 |
“wb"二进制写 | 为了输出数据,打开一个二进制文件 | 创建新文件 |
“ab”二进制追加 | 向一个二进制文件尾添加数据 | 出错 |
“r+读写 | 读和写,打开一个文本文件 | 出错 |
“w+”写读 | 读和写,打开一个文本文件 | 创建新文件 |
“a+读写 | 打开文件,在文件尾进行读写 | 创建新文件 |
“rb+读写 | 读和写,打开一个二进制文件 | 出错 |
“wb+读写 | 读和写,打开一个二进制文件 | 创建新文件 |
“ab+读写 | 打开二进制文件,在文件尾进行读和写 | 创建新文件 |
#include<stdio.h>
int main()
{
FILE* fp;
fp = fopen("file.txt","r");
}
文件输入流操作
函数 | 功能 |
---|---|
fgetc() | 字符输入函数 |
fgets() | 文本行输入函数 |
fscanf () | 格式化输入函数 |
fread() | 二进制输入 |
文件输出流操作
函数 | 功能 |
---|---|
fputc() | 字符输出函数 |
fputs() | 文本行输出函数 |
fprintf () | 格式化输出函数 |
fwrite() | 二进制输出 |
#include<stdio.h>
int main()
{
FILE* fp;
char ch[1024];//用字符串接受读出的字符
fp = fopen("file.txt","r");
fgets(ch,sizeof(ch),fp);//读取一行
}
fgets每读取一行,文件指针会指向下一行。
#include<stdio.h>
int main()
{
FILE* fp;
fp = fopen("file.txt","r");
fputs("put string in",fp);
}
fput在当前行写入字符串。
如果是以“a”模式打开,则从文本末尾开始写入字符串。
rewind()
文件指针指向回到文件起始位置。void rewind(FILE* stream)
fseek()
根据文件指针的位置和偏移量来定位文件指针int fseek(FILE* stream, long int offset, int origin )
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
#include <stdio.h>
int main()
{
FILE* fp;
char ch[1024];
fp = fopen("test.txt","w+");
fputs("I LOVE YOU.",fp);
fseek(fp,10,SEEK_SET); //指针指向文件开始处第10个字节
fputs(" Lily",fp); //插入新字符串
fseek(fp,0,SEEK_SET); //此时将指针重写指向起始位置
fgets(ch,sizeof(ch),fp); //结果为 I LOVE YOU Lily.
printf("%s",ch);
}