C语言文件操作总结
程序员文章站
2022-03-05 11:54:51
...
1 fopen文件操作方式
操作方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”只读 | 为了输入数据,打开一个已存在的文本文件 | 出错 |
“w”只写 | 为了输出数据,打开一个文本文件(清空) | 建立新文件 |
“a”追加 | 向文本文件末尾添加数据 | 出错 |
“rb”只读 | 为了输入数据,打开一个已存在的二进制文件 | 出错 |
“wb”只读 | 为了输出数据,打开一个二进制文件(清空) | 建立新文件 |
“ab”追加 | 向二进制文件末尾添加数据 | 出错 |
“r+”读写 | 为了读和写,打开一个文本文件 | 出错 |
“w+”读写 | 为了读和写,打开一个文本文件(清空) | 建立新文件 |
“a+”读写 | 为了读和写,打开一个文本文件 | 出错 |
“rb+”读写 | 为了读和写,打开一个二进制文件 | 出错 |
“wb+”读写 | 为了读和写,打开一个二进制文件(清空) | 建立新文件 |
“ab+”读写 | 为了读和写,打开一个二进制文件 | 出错 |
- 用“
r
”方式打开文件只能用于向计算机输入而不能用作向该文件输出数据(即读数据到变量中),若文件不存在会出错 - 用“
w
”方式打开文件只能用于向该文件写数据(即往文件里写数据),而不能用来向计算机输入,如果原文件不存在,则创建该文件,若该文件已存在,则打开文件前将其删除,再重新创建一个 - 若要向文件末尾添加数据(不希望删除原有数据),则使用“
a
”方式,文件不存在会出错 - 带“
+
”的方式,既可用来输入数据,也可用来输出数据 - 若以任意方式打开文件失败,
fopen
函数会返回NULL
- 在以文本文件(ASCII)读入字符时,遇到回车换行符(
\r\n
),系统把它转换为一个换行符(\n
),在输出时把换行符(\n
)转换为回车(\r
)和换行(\n
)两个字符 - 在以二进制方式时,不进行上述转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应
1.1 打开文件fopen
FILE *fp = fopen("abc.txt", "r");
1.2 关闭文件fclose
fclose(fp); // 关闭成功返回0,否则返回EOF(-1)
2 向文件读写字符
2.1 读字符fgetc
函数原型int fgetc(FILE *stream)
- 调用形式
ch = fgetc(fp)
- 从
fp
指向的文件读入一个字符,该函数以无符号char
强制转换为int
的形式返回读取的字符,读成功,带回所读的字符,失败则返回文件结束标志EOF
(-1)
2.2 写字符fputc
函数原型int fputc(int char, FILE *stream)
- 调用形式
fputc(ch,fp)
- 把字符
ch
写到文件指针变量fp
所指的文件中,输出成功返回值就是输出的字符,输出失败则返回EOF
(-1)
3 向文件读写字符串
3.1 读字符串fgets
函数原型char *fgets(char *str, int n, FILE *stream)
- 调用形式
fgets(str, n, fp)
-
n
为要求得到字符个数(但实际上只有n-1
),从fp
所指的文件读入一个长度为n-1
的字符串,并在最后加一个\0
- 然后把这
n
个字符存放在字符数组str
中,若在读完n-1
个字符之前遇到换行符(\n
)或文件结束符EOF
,读入结束 - 若执行函数成功,则返回
str
数组首元素的地址,若一开始就遇到文件末尾或读数据出错,则返回NULL
3.2 写字符串fputs
函数原型int fputs(const char *str, FILE *stream)
- 调用形式
fputs(str, fp)
,把str
所指向的字符串写到文件指针变量fp
指向的文件中,字符串末尾的\0
不输出 - 输出成功返回
0
,失败返回EOF
4 格式化方式读写文件
fprintf
和fscanf
,在输入时要将文件的ASCII码转换为二进制形式在保存,再输出时又要将二进制形式转换为字符,要花费较多时间
4.1 格式化写fprintf
函数原型int fprintf(FILE *stream, const char *format, ...)
- 如果成功,则返回写入的字符总数,否则返回一个负数
4.2 格式化读fscanf
函数原型int fscanf(FILE *stream, const char *format, ...)
- 如果成功,返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回
EOF
5 二进制向文件读写一组数据
5.1 二进制读fread
函数原型size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
,
-
ptr
为从文件读入的数据保存的地址 -
size
为要读的字节数 -
nmemb
为元素的个数,每个元素的大小为 size 字节 -
stream
输出流的FILE
指针 - 返回成功读取的个数
5.2 二进制写fwrite
函数原型size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
-
ptr
为要向文件写入的数据首地址 -
size
为要写的字节数 -
nmemb
为元素的个数,每个元素的大小为 size 字节 -
stream
输入流的FILE
指针 - 返回成功写入的个数
6 随机读写数据文件
6.1 指向文件开头rewind
函数原型void rewind(FILE *stream)
-
rewind
的作用是使文件位置标记重新返回文件的开头 - 此函数没有返回值
- 调用形式
rewind(fp);
,将fp
指向文件开头
6.2 改变位置fseek
函数原型int fseek(FILE *stream, long int offset, int whence)
-
stream
为所操作的文件指针 -
offset
这是相对 whence 的偏移量,以字节为单位,注意它是long int
类型 -
whence
这是表示开始添加偏移offset
的位置。它一般指定为下列常量之一:
常量 | 描述 | 数字表示 |
---|---|---|
SEEK_SET | 文件的开头 | 0 |
SEEK_CUR | 文件指针的当前位置 | 1 |
SEEK_END | 文件的末尾 | 2 |
- 向后移动,调用形式
fseek(fp,100L,SEEK_SET);
,表示从文件的开头,向后偏移到100
个字节 - 向前移动,调用形式
fseek(fp,-200L,SEEK_END);
,表示从文件的末尾,向前偏移到200
个字节 - 如果成功,则该函数返回零,否则返回非零值
6.3 测定当前位置ftell
函数原型long int ftell(FILE *stream)
-
stream
文件指针 -
ftell
函数的作用是得到流式文件中文件位置标记的当前位置 - 该函数返回位置标识符的当前值。如果发生错误,则返回
-1L
,全局变量errno
被设置为一个正值
7 文件读写出错检测
7.1 函数ferror
- 在调用一个输入输出函数后,可以使用
ferror(fp)
检测是否出现错误 - 返回
0
代表未出错,返回非零表示出错 - 对同一个文件每调用一次输入输出函数,都会产生新的值,应该在每次输入输出函数调用后,立即检测
7.2 函数clearerr
- 若调用一个输入输出函数出错后,
ferror
为非零值 - 调用
clearerr(fp);
可以将错误标记的值置位0
,以便一下次检测
上一篇: springboot2.x使用事务
下一篇: SpringBoot2.x——多环境配置