当前位置: 首页 > backend >正文

【无标题】标准 I/O 中的一些函数,按功能分类说明其用法和特点

下面详细讲解标准 I/O 中的这些函数,按功能分类说明其用法和特点:

一、文件打开与关闭

1. fopen():打开文件

功能:打开指定文件并返回文件流指针(FILE*),用于后续操作。
原型

FILE *fopen(const char *filename, const char *mode);

参数

  • filename:文件名(含路径)
  • mode:打开模式(常用):
    • "r":只读(文件必须存在)
    • "w":只写(文件不存在则创建,存在则清空)
    • "a":追加(在文件末尾写入,不存在则创建)
    • "r+":读写(文件必须存在)
    • "w+":读写(文件不存在则创建,存在则清空)

返回值:成功返回 FILE* 指针,失败返回 NULL

示例

FILE *fp = fopen("test.txt", "r");
if (fp == NULL) {perror("打开文件失败");return 1;
}
2. fclose():关闭文件

功能:关闭已打开的文件流,释放资源并刷新缓冲区。
原型

int fclose(FILE *stream);

返回值:成功返回 0,失败返回 EOF

示例

fclose(fp);  // 关闭文件,必须在操作完成后调用

二、按数据块读写(二进制/文本通用)

1. fread():从文件读取数据块

功能:从文件流中读取指定大小和数量的数据块。
原型

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

参数

  • ptr:存储读取数据的缓冲区
  • size:每个数据块的字节数
  • nmemb:要读取的数据块数量
  • stream:文件流指针

返回值:成功读取的实际数据块数量(小于 nmemb 可能表示到文件尾或出错)。

示例:读取 10 个 int 类型数据

int arr[10];
size_t n = fread(arr, sizeof(int), 10, fp);
printf("成功读取 %zu 个整数\n", n);
2. fwrite():向文件写入数据块

功能:向文件流中写入指定大小和数量的数据块。
原型

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

参数:与 fread() 类似,ptr 为要写入的数据。

返回值:成功写入的实际数据块数量(小于 nmemb 表示出错)。

示例:写入 5 个 double 类型数据

double data[] = {1.1, 2.2, 3.3, 4.4, 5.5};
fwrite(data, sizeof(double), 5, fp);

三、格式化输入输出(文本专用)

1. 标准设备格式化 I/O
  • printf():向标准输出(屏幕)格式化输出

    printf("姓名:%s,年龄:%d\n", "张三", 20);
    
  • scanf():从标准输入(键盘)格式化输入

    int age;
    printf("请输入年龄:");
    scanf("%d", &age);  // 注意取地址符 &
    
2. 文件格式化 I/O
  • fprintf():向文件流格式化输出

    fprintf(fp, "成绩:%d,等级:%c\n", 90, 'A');  // 写入文件
    
  • fscanf():从文件流格式化输入

    int score;
    char grade;
    fscanf(fp, "%d %c", &score, &grade);  // 从文件读取
    

特点:支持格式控制符(%d%s%f 等),适合文本文件的结构化读写。

四、按字符操作

1. fgetc():读取单个字符

功能:从文件流中读取一个字符(ASCII 码)。
原型

int fgetc(FILE *stream);

返回值:成功返回字符的 ASCII 码(int 类型),失败或到文件尾返回 EOF

示例:逐个字符读取文件内容

int c;  // 必须用 int 类型接收(避免与 EOF 混淆)
while ((c = fgetc(fp)) != EOF) {putchar(c);  // 输出到屏幕
}
2. fputc():写入单个字符

功能:向文件流中写入一个字符。
原型

int fputc(int c, FILE *stream);

参数c 为要写入的字符(ASCII 码)。

返回值:成功返回写入的字符,失败返回 EOF

示例:向文件写入字符 ‘A’ 和换行符

fputc('A', fp);
fputc('\n', fp);  // 写入换行

五、按行操作(文本专用)

1. fgets():读取一行字符串

功能:从文件流中读取一行字符(包含换行符 \n)。
原型

char *fgets(char *str, int size, FILE *stream);

参数

  • str:存储读取结果的缓冲区
  • size:最大读取长度(实际最多读 size-1 个字符,预留 \0
  • stream:文件流指针

返回值:成功返回 str,失败或到文件尾返回 NULL

示例:逐行读取文件

char buf[1024];
while (fgets(buf, sizeof(buf), fp) != NULL) {printf("%s", buf);  // 输出一行(含换行符)
}
2. fputs():写入一行字符串

功能:向文件流中写入一个字符串(不自动添加换行符)。
原型

int fputs(const char *str, FILE *stream);

示例:向文件写入一行文本

fputs("Hello, World!", fp);  // 无换行
fputs("这是新的一行\n", fp);  // 手动添加换行

总结

类别函数组核心特点
文件控制fopen()fclose()打开/关闭文件,获取文件流指针
数据块读写fread()fwrite()适合二进制文件,按固定大小块操作
格式化 I/Oprintf/scanf支持格式控制,适合文本的结构化读写
字符操作fgetc()fputc()逐个字符读写,灵活但效率较低
行操作fgets()fputs()按行读写文本,自动处理换行符

这些函数均属于标准 I/O 库,自带缓冲机制,使用时需注意:

  • 操作完成后必须用 fclose() 关闭文件(自动刷新缓冲区)
  • 文本文件建议用格式化/行操作函数,二进制文件建议用 fread()/fwrite()
  • 错误处理:通过返回值(如 EOFNULL)判断操作是否成功
http://www.xdnf.cn/news/16971.html

相关文章:

  • 【LeetCode刷题集】--排序(一)
  • clocking_cb驱动之坑
  • BackgroundTasks 如何巧妙驾驭多任务并发?
  • 测试-概念篇(3)
  • <PhotoShop><JavaScript><脚本>基于JavaScript,利用脚本实现PS软件批量替换图片,并转换为智能对象?
  • Linux 逻辑卷管理
  • 深入理解Spring中的循环依赖及解决方案
  • ssh连接VirtualBox中的Ubuntu24.04(win11、putty、NAT 模式)
  • 模型蒸馏(Distillation):原理、算法、应用
  • 每日任务day0804:小小勇者成长记之药剂师的小咪
  • 深入剖析Java Stream API性能优化实践指南
  • AgxOrin平台JetPack5.x版本fix multi-cam race condition 补丁
  • (2023ICML)BLIP-2:使用冻结图像编码器和大语言模型引导语言-图像预训练
  • Ubuntu共享文件夹权限设置
  • 【数据结构初阶】--顺序表(一)
  • 使用AWS for PHP SDK实现Minio文件上传
  • nodejs 封装方法将打印日志输出到指定文件
  • mybatis-plus报错Caused by: java.sql.SQLException: 无效的列类型: 1111
  • 论文Review LIO Multi-session Voxel-SLAM | 港大MARS出品!体素+平面特征的激光SLAM!经典必读!
  • Spring Boot 应用结合 Knife4j 进行 API 分组授权管理配置
  • 【世纪龙科技】汽车自动变速器拆装虚拟实训软件
  • 国产化低代码平台如何筑牢企业数字化安全底座
  • Go语言 并发安全sync
  • Linux 磁盘管理
  • 如何选择一个容易被搜索引擎发现的域名?
  • 从零开始的云计算生活——项目实战
  • Perl 面向对象编程深入解析
  • 京东商品销量数据如何获取?API接口调用操作详解
  • AWS VPC Transit Gateway 可观测最佳实践
  • [特殊字符] Ubuntu 下 MySQL 离线部署教学(含手动步骤与一键脚本)