C语言入门简明教程
0x07 文件操作
写在开头
如果程序没有和环境的交互,就好像七夕时没有男/女朋友的你,文件操作是一种控制台输入输出之外常用的交互的方式。
注意! 文件操作需要用到指针,请仔细阅读指针相关内容!
fopen(filename, mode):打开文件流
使用fopen会返回一个文件指针,指向打开后的文件流。如果打开失败,则返回NULL
FILE *fopen(const char* filename, const char* mode);//fopen
//例:
FILE *fp=fopen("c:\\test.txt","w");
其中,打开模式有多种,这边给出:
模式 | 描述 |
---|---|
“r” | 以只读方式打开文件,文件必须存在 |
“w” | 以写方式打开文件,此方式将清除原来内容并重写新内容 |
“a” | 以写方式打开文件,追加内容到文件结尾,文件不存在则创建 |
“r+” | 打开文件,可读可写,文件必须存在 |
“w+” | 创建可读可写的空文件 |
“a+” | 打开可读可追加内容的文件 |
特别地,在英文后面加上字符b会以二进制方式操作,如二进制读为"rb"
fclose(fp):关闭文件流
就像要随手关灯,文件打开完读写完也要关闭文件流。这边我们使用fclose 可以方便地关闭文件流。
int fclose(FILE *fp);
fgetc(fp):从文件流读取一个字符
由于存在文件结尾(EOF, 值为-1),fgetc返回的是一个int值,需要转换为char
int fgetc(FILE *fp);
//例:
while(true){
int fc=fgetc(fp);
if(fc==EOF)break;
putchar((char)fc);
}//读取文件所有内容,已省略文件流的创建和关闭内容
fputc(char, fp):向文件写一个字符
一看就会,就像putchar 一样,只是多一个指向要写入文件的文件指针
int fputc(int c, FILE *fp);
fgets(outstr, n, fp):从文件流读取一行
如果一个个读取字符可能会有点烦,我们可以使用fgets来进行整行的读取:
char* fgets(char *outstr, int n, FILE *fp);
//第一个参数是读取内容所存放的字符串指针,第二个值是将可能读取到的最大字符数量,第三个是文件指针
//如果读取成功,则返回outstr指针,否则返回NULL
fputs(str, fp):向文件写入字符串
fputs将向文件写入一个字符串,但不包括\0的空字符
int fputs(char *str, FILE *fp);
//写入失败则返回EOF
fprintf和fscanf:格式化文件读取、写入
相较于前面的读写方法,fprintf和fscanf提供了更方便的、就像printf和scanf一样好用的文件读取和写入方式。
int fprintf(FILE *fp, const char* format, ...);
//就像printf一样,只是第一个参数是文件指针,然后才是格式化字符串和参数列表
int fscanf(FILE *fp, const char* format, ...);
//就像scanf,第一个参数同样为文件指针
fflush(fp):清空缓冲区
如果文件为写状态,写的内容在关闭前都在内存的缓冲区,为了避免不必要的浪费,我们使用fflush将内容写道磁盘上的文件里并清空缓冲区。
int fflush(FILE *fp);
rewind(fp):将文件指针指回文件开头
一看就会:
void rewind(FILE *fp);
fseek(fp, offset, origin):移动文件流指针
有时候我们不需要从头读写文件,于是我们可以使用fseek来修改开始位置和偏移量,做到更高效地读写文件。
int fseek(FILE *fp, long offset, int origin );
//fp为文件流指针,offset为当前指针偏移位置,origin为指针开始的位置
起始点 | 常量名 |
---|---|
文件开头 | SEEK_SET |
当前位置 | SEEK_CUR |
文件末尾 | SEEK_END |
因此当origin为SEEK_SET时将从文件开头偏移offset的位置开始读写;
SEEK_CUR将从当前已经到的位置偏移offset位置开始,SEEK_END则从结尾偏移offset。
注意: offset可为负值,可以在一个位置向前移动文件指针。
ftell(fp):返回当前文件指针所在位置
返回值是一个long,为当前位置离开头的偏移字节数
long ftell(FILE *fp);
freopen(filename, mode, stream):重定向文件流
有时候我们只需要向文件写入,而多打一个f有时候会让我们觉得很烦,通过重定向到stdin(标准输入流)、stdout(标准输出流)、stderr(标准错误)可以方便地读取写入。
FILE *freopen(const char *filename, const char *mode, FILE *stream);
//例子:
if(freopen("out.txt","w",stdout)==NULL)printf("freopen failed.\n");//重定向失败
else{
printf("succeeded.\n");//相当于像文件里面写入了succeeded.
//将重定向改为读取模式并将重定向流改成stdin还可以用scanf读取文件内容
}
remove(filename):删除文件或目录
有时候要删掉一个没用的文件比如刚刚的浏览器历史记录文件或者学习资料文件夹,这时候就可以使用remove方便地删除:
int remove(const char* filename);
//成功返回0,失败返回-1
总结
文件挺好玩的,就是这样~
EOF