网站首页 > 技术文章 正文
一、打开关闭文件
1. 打开文件
#include <stdio.h>
FILE *fopen(const char *filepath, const char *mode);
字符串 filepath 表示文件路径,可以是相对路径或绝对路径。字符串 mode 是访问模式,其值可以是下列情况:
- r :以只读模式打开一个已有的文本文件,从文件头开始读取。
- w :以只写的模式打开一个文本文件,从文件头开始写入。如果文件不存在,则创建新文件。写入会覆盖文件全部内容。
- a :以追加的模式打开一个文本文件,从文件末尾追加内容。如果文件不存在,则创建新文件。
- r+ :以读和写的模式打开一个已有的文本文件,从文件头开始读取和写入。覆盖写入位置的内容,其他位置内容保留。
- w+ :以读和写的模式打开一个文本文件,从文件头开始读取和写入。如果文件不存在,则创建新文件。写入会覆盖文件全部内容。
- a+ :以读和追加的模式打开一个文本文件,从文件末尾追加内容。如果文件不存在,则创建新文件。
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"
如果打开文件成功该方法会返回一个指向 FILE 结构的指针,如果失败则返回 NULL 并设置 errno 错误。
2. 关闭文件
#include <stdio.h>
int fclose(FILE *fp);
用于关闭先前由 fopen 函数打开的文件。如果成功关闭文件,fclose( ) 函数返回 0,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。注意文件操作完成后应及时关闭文件。
3. 示例
#include <stdio.h>
#include <stdlib.h>
int main()
{
/* 定义一个指向文件类型的指针 */
FILE *fp;
int ch;
/* 以只读模式打开本地 hello.txt 文件 */
fp = fopen("./hello.txt", "r");
if (fp == NULL) {
printf("文件打开失败!");
exit(EXIT_FAILURE);
}
/* 循环从文件中读取一个字符 */
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
putchar('\n');
/* 关闭文件 */
fclose(fp);
return 0;
}
二、文件指示器
#include <stdio.h>
int feof(FILE *stream);
int ferror(FILE *stream);
void clearerr(FILE *stream);
- feof() 用于检测文件的末尾指示器是否被设置。返回一个非 0 值;如果检测不到末尾指示器被设置,返回值为 0。
- ferror() 用于检测文件的错误指示器是否被设置。返回一个非 0 值;如果检测不到错误指示器被设置,返回值为 0。
- clearerr() 用于清除指定文件的末尾指示器和错误指示器。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int ch;
/* 以只读模式打开文件 */
if ((fp = fopen("./hello1.txt", "r")) == NULL) {
printf("打开文件失败!\n");
exit(EXIT_FAILURE);
}
while (1) {
ch = fgetc(fp);
/* 判断读取文件时是否存在错误 */
if (ferror(fp)) {
printf("读取文件时出错...\n");
break;
}
/* 如果读取到文件末尾,就结束读取 */
if (feof(fp)) {
break;
}
putchar(ch);
}
/* 清理错误指示器与末尾指示器 */
clearerr(fp);
/* 关闭文件 */
fclose(fp);
return 0;
}
三、错误信息
在发生错误时,大多数的函数调用会返回 1 或 NULL,同时会设置一个错误代码 errno,该错误代码是全局变量,表示在函数调用期间发生了错误。我们可以在 errno.h 头文件中找到各种各样的错误代码。
C 语言提供了 perror() 和 strerror() 函数来显示与 errno 相关的文本消息。
- perror() 函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。
- strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main()
{
FILE *pf;
int errnum;
pf = fopen("unexist.txt", "rb");
if (pf == NULL) {
errnum = errno;
/* 输出错误号到标准错误输出 */
fprintf(stderr, "错误号: %d\n", errnum);
/* 获取错误号的文本说明 */
fprintf(stderr, "错误信息: %s\n", strerror(errnum));
/* 使用 perror 打印错误信息 */
perror("通过 perror 输出错误");
/* 设置退出状态为 EXIT_FAILURE */
exit(EXIT_FAILURE);
}
/* 关闭文件 */
fclose(pf);
return 0;
}
通常情况下,程序成功执行完一个操作正常退出的时候会带有值 EXIT_SUCCESS(值为 0 的宏)。而如果存在错误的情况,当您退出程序时,会带有状态值 EXIT_FAILURE(值为 -1 的宏)。
我们还可以使用重定向将错误信息打印到指定为文件:
# 将标准错误输出重定向到指定文件
$ gcc test.c && ./a.out 2> error.log
猜你喜欢
- 2024-09-27 分享一段神奇的小代码:那天是周几啊
- 2024-09-27 线性表顺序存储结构求集合的并,交,补,差(源代码附上 超详细)
- 2024-09-27 如何轻松使用 C 语言实现一个栈?(c语言如何建立一个栈)
- 2024-09-27 C语言学习:写一个文件的实例,详解(收藏)
- 2024-09-27 C语言学习过程代码记录(c语言代码例子)
- 2024-09-27 输出随机数字:C之法(c语言怎么随机输出字母)
- 2024-09-27 C++头文件和std命名空间(精辟)(c++头文件类型)
- 2024-09-27 【C高手秘籍】在处理复杂数据结构时,如何提高代码的运行效率?
- 2024-09-27 【C语言】(25)文件包含(c语言中,文件由什么组成)
- 2024-09-27 简单的加密文本手段,c语言新手也会
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)