网站首页 > 技术文章 正文
一、打开关闭文件
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语言新手也会
- 1515℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 579℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 515℃MySQL service启动脚本浅析(r12笔记第59天)
- 487℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 486℃启用MySQL查询缓存(mysql8.0查询缓存)
- 471℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 451℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 449℃MySQL server PID file could not be found!失败
- 最近发表
-
- 宝塔面板Nginx如何提高网站访问速度?
- 接口调试工具ApiPost中form-data/x-www-form-urlencoded/raw区别
- 高并发场景下,Nginx性能如何提升10倍?
- 高并发场景下,Nginx如何抗住千万级流量?
- 浏览器中在线预览pdf文件,pdf.mjs插件实现web预览pdf
- 为什么你的网站加载慢?90%的人忽略了这2个设置。
- 别再无脑复制Nginx配置了!掌握这10个"性能核弹"级参数
- 你的Nginx配置,可能就是你网站最慢的一环,注意这几个优化参数
- 深入浅出HTTP压缩技术(http2压缩)
- C程序设计之:1-1/2+1/3-... + 1/n 的和
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (83)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)