C语言文件操作
2019-07-24 16:23
113 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42512675/article/details/94780976
一切皆文件。
什么是文件?
磁盘上的文件是文件,但程序设计中,我们一般谈的文件有两种:程序文件、数据文件。
文件=文件属性+文件内容
文件名
文件路径+文件名主干+文件后缀
例如:C:\code\test.txt
文件类型
- 二进制文件:内存中以二进制形式存储,在硬盘上以相同方式存储。如 .exe文件。
- 文本文件:内存中以二进制形式存储,在硬盘上会有一定转化。如 .c / .h文件。
注意:excel不是文本文件。
一个数据在内存中如何存储?
字符一律以ASCII码形式存储。(ASCII码:数字和符号的对应关系,为了方便人看)
测试代码:
#include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) int main() { int a = 10000; FILE* pf = fopen("test.txt", "wb");//前面的引号内为要打开的文件名,若无路径,则在当前路径下; //w代表写入,b代表二进制形式。 fwrite(&a, 4, 1, pf); fclose(pf); pf = NULL; system("pause"); return 0; }
文件缓冲区
优点:节省时间
缺点:但数据有可能丢失
文件数据的缓冲方式:
- 无缓冲:(效率最低)
- 行缓冲:一般往显示器上打的都是,如printf。没有把缓冲区写满。(照顾用户)
- 全缓冲:必须缓冲区写满再刷。(效率最高)
文件指针
- 对文件进行操作时,文件指针必不可少;
- 程序启动时,打开文件时,可称为打开一个流
- 文件指针又称为句柄;
- 任何一个程序,默认启动时,打开三个流:
(1)标准输入—>stdin—>键盘
(2)标准输出—>stdout—>显示器
(3)标准错误—>stderr—>显示器
键盘和显示器均为文件。
文件的打开和关闭
打开:fopen
FILE* fopen (const char* filename,const char* mode);
第一个参数为带或不带路径的文件,该文件可存在,也可不存在;
若不存在:
- 以写方式时,它会自动创建;
- 以读方式时,会报错;
第二个为模式,模式有很多种。
关闭:fclose
int fclose(FILE* stream);
1.打开成功时,返回值为FILE*;
2.关闭时也必须传入FILE*。
打开方式如下:
文件使用方式 | 含义 |
---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 |
“w”(只写) | 为了输出数据,打开一个文本文件 |
“a”(追加) | 向文本文件尾添加数据 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 |
“wb”(只写) | 为了输出一个数据,打开一个二进制文件 |
“ab”(追加) | 向二进制文件尾添加数据 |
“r+”(读写) | 为了读和写,打开一个文本文件 |
“w+”(读写) | 为了读和写,建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 |
“rb+” | 为了读和写,打开一个二进制文件 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 |
实例代码:
#include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) int main() { FILE * pFile; pFile = fopen("myfile.txt", "w"); if (pFile != NULL) { fputs("fopen example", pFile); fclose(pFile); } system("pause"); return 0; }
文件的顺序读写
(修改文件内容)
功能 | 函数名 |
---|---|
字符输入函数 | fgetc |
字符输出函数 | fputc |
文本行输入函数 | fgets |
文本行输出函数 | fputs |
格式化输入函数 | fscanf |
格式化输出函数 | fprintf |
二进制输入 | fread |
二进制输出 | fwrite |
注意:fputs函数在写入时会自动将 \n 转为 \r\n 。
对比一组函数:
scanf/fscanf/sscanf
printf/fprintf/sprintf
printf:
int printf(const char* format, ...);
scanf:
int scanf(const char* format, ...);
fprintf:
int fprintf(FILE * stream, const char* format, ...);
fscanf:
int fscanf(FILE * stream, const char* format, ...);
sprintf:
int sprintf(char * str, const char* format, ...);
ssacnf:
int sscanf(char * str, const char* format, ...);
在C语言中,…表示可变参数。 sprintf , sscanf 可用于字符串转整形,整形转字符串。
文件的随机读写
(修改文件的属性)
fseek
通过修正文件读写位置和偏移量来指定地向文件特定位置去写。(无写入文件能力,只能指定位置,修改文件当前读写位置的属性。)
int fseek(FILE * stream, long int offset, int origin); //offset为偏移量,可正可负;origin为初始位置
origin:
SEEK_SET—>文件开头
SEEK_CUR—>文件指针的当前位置
SEEK_END—>文件结束
ftell
告诉我们当前读写位置
long int ftell(FILE * stream);
rewind
让文件指针的位置回到文件的起始位置
void rewind(FILE * stream);