✨️ 复制成功,转载请标注本文地址

标准IO

938 字
5 分钟
标准IO

标准IO流的打开和关闭#

流的打开和关闭#

打开流

标准IO中提供了fopen函数,用于打开标准IO流,原型如下:

FILE* fopen
(
//被打开的文件名称
char const* _FileName,
//打开模式
char const* _Mode
);

p打开成功,返回流指针(FILE结构体指针);出错返回NULL

打开模式

mode参数支持模式如下

模式(mode)含义文件是否存在的要求
“r”或“rb”只读打开文件必须存在
“r+”或“r+b”可读可写打开文件必须存在,从文件起始位置写入
“w”或“wb”仅写打开不存在则创建;存在会清空原有内容
“w+”或“w+b”可读可写打开不存在则创建;存在会清空原有内容
“a”或“ab”仅写打开不存在则创建;如已存在且有内容,在文件末尾追加新内容
“a+”或“a+b”可读可写打开不存在则创建;如已存在且有内容,写入会在文件末尾追加新内容

p当给定”b”参数时,表示二进制方式打开(仅Windows有效,Linux忽略b参数不区分是否是b)

流的关闭

标准IO中提供了fclose函数,用于打开标准IO流,原型如下:

int fclose(FILE* _Stream);

传入的参数为被关闭的流指针(FILE结构体指针);

  • 关闭成功返回整数0;关闭失败返回EOF(整数-1),并设置errno
  • 关闭后自动刷新缓冲区数据并释放其空间
  • 程序正常停止后,所有打开的流都会被关闭,流关闭后不可再操作

示例代码

创建文件

#include <stdio.h>
int main(void) {
FILE *fp = fopen("test.txt", "w");
fclose(fp);
return 0;
}

以读的方式打开文件, 并且通过fgets每次获取一行

#include <stdio.h>
int main(){
FILE * fp = fopen("test.txt", "r");
char line[1024] = "";
while(fgets(line, 1024, fp) != NULL){
printf("%s",line);
}
fclose(fp);
return 0;
}

处理错误信息#

在打开流的过程中,有可能出现错误,标准IO提供了3个可操作对象供处理错误信息。

  • extern int errno; 错误号

  • void perror(const char *s); 打印错误信息,输出用户提供字符串s和当前错误

  • char * strerror(int errno); 根据错误号,返回错误信息字符串

  • 使用error错误号,需要包含 error.h 头文件

  • 使用perror函数,需要包含 stdio.h 头文件

  • 使用strerror函数,需要包含 string.h 头文件

示例代码1,基于perror函数处理错误信息:

#include <stdio.h>
int main(void)
{
FILE * fp= fopen("test.txt", "r");// 此文件不存在
if (fp == NULL)
{
perror("错误信息是:");
return -1;
}
fclose(fp);
return 0;
}

示例代码2,基于strerror函数处理错误信息:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(void)
{
FILE *fp = fopen("test.txt", "r"); // 此文件不存在
if (fp == NULL)
{
printf("错误号是:%d\n", errno);
printf("错误信息是:%s\n", strerror(errno));
return -1;
}
fclose(fp);
return 0;
}

strerror_s函数

为了避免strerror的C4996警告,可以使用strerror_s函数,需包含 string.h 头文件

int strerror_s(
//存放错误信息字符串
char* _Buffer,
//大小(bytes),和字符串数组长度一致即可
unsigned long long _SizeInBytes,
//错误号
int _ErrorNumber
);

注意strerror_s不是c标准库的内容,需要编译器支持c11标准, 所以我们在代码之前打开c11标准扩展, 需提前定义#define __STDC_WANT_LIB_EXT1__ 1,

在使用的时候通过宏__STDC_LIB_EXT1__判断,我们的编译器是否支持c11标准扩展

#define __STDC_WANT_LIB_EXT1__ 1
#include <locale.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(void)
{
FILE *fp = fopen("test.txt", "r"); // 此文件不存在
if (fp == NULL)
{
printf("错误号是:%d\n", errno);
char err_msg[1024] = "";
#ifdef __STDC_LIB_EXT1__
strerror_s(err_msg, 1024, errno);
printf("错误信息是:%s", err_msg);
#endif
return -1;
}
fclose(fp);
return 0;
}

编译时使用gcc -std=c11 ./main.cpp

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

标准IO
https://godze.online/posts/linux/标准io/
作者
Vafail
发布于
2026-05-13
许可协议
CC BY-NC-SA 4.0

评论区

公告
欢迎来到我的博客!
分类
标签
最新动态
站点统计
文章
61
分类
6
标签
8
总字数
136,467
运行时长
0
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.15.3
文章许可
CC BY-NC-SA 4.0