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

C语言文件读写函数详解与示例(fread、fgets、fgetc、fscanf、fwrite、fputs 和 fputc比较)

在进行文件操作时,C语言为我们提供了多种强大而灵活的函数。本文将详细介绍常用的文件读写函数:fread、fgets、fgetc、fscanf、fwrite、fputs 和 fputc,并通过示例代码加以说明。

一、文件读取函数(从文件里“读”数据)

1. fread —— 读二进制数据块

函数原型

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

参数解释:

  • ptr:指向接收数据的缓冲区的指针。
  • size:每个数据块的大小(以字节为单位)。
  • count:要读取多少个数据块。
  • stream:文件指针。

代码示例:

#include <stdio.h>int main() {FILE *fp = fopen("example.bin", "rb");  // 打开一个二进制文件,模式为“读”(r)+“二进制”(b)if (!fp) return 1;  // 打开失败就退出char buffer[100];  // 创建一个长度为100的字符数组来接收数据size_t n = fread(buffer, sizeof(char), 100, fp);  // 读取最多100个字节到 buffer 中printf("Read %zu bytes\n", n);  // 打印实际读取的字节数fclose(fp);  // 关闭文件return 0;
}

2. fgets —— 一次读一行,适合文本文件

函数原型:

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

参数解释:

  • str:接收读取结果的字符数组。
  • n:最多读取 n-1 个字符,留一个位置给字符串结束符 \0。
  • stream:文件指针。

代码示例:

#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");  // 打开文本文件,模式为只读if (!fp) return 1;char line[256];  // 准备一个数组来存放每一行while (fgets(line, sizeof(line), fp)) {  // 逐行读取文件内容printf("%s", line);  // 打印当前行}fclose(fp);return 0;
}

3. fgetc —— 一次读一个字符

函数原型:

int fgetc(FILE *stream);

代码举例:

#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");  // 打开文本文件if (!fp) return 1;int ch;while ((ch = fgetc(fp)) != EOF) {  // fgetc 读取一个字符(返回 int),遇到文件结尾返回 EOFputchar(ch);  // 输出读取的字符}fclose(fp);return 0;
}

4. fscanf —— 从文件中格式化读取,类似 scanf

函数原型:

int fscanf(FILE *stream, const char *format, ...);

假设 data.txt 中有如下内容:

Tom 25

代码举例:

#include <stdio.h>int main() {FILE *fp = fopen("data.txt", "r");  // 打开文件if (!fp) return 1;char name[50];int age;fscanf(fp, "%s %d", name, &age);  // 从文件中读取一个字符串和一个整数printf("Name: %s, Age: %d\n", name, age);  // 打印结果fclose(fp);return 0;
}

二、文件写入函数(把数据“写”进文件)

1. fwrite —— 写二进制数据块

函数原型

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

代码举例:

#include <stdio.h>int main() {FILE *fp = fopen("output.bin", "wb");  // 打开文件写二进制数据(w + b)if (!fp) return 1;char data[] = "Hello, binary!";fwrite(data, sizeof(char), sizeof(data), fp);  // 写入整个字符串(包括结尾的 '\0')fclose(fp);return 0;
}

2. fputs —— 写一行字符串(不自动加换行)

函数原型:

int fputs(const char *str, FILE *stream);
  • str:指向要写入的以 null 结尾的字符串(const char *)。
  • stream:表示写入目标的文件流(通常由 fopen() 打开)。

代码举例:

#include <stdio.h>int main() {FILE *fp = fopen("output.txt", "w");  // 打开文本文件写入if (!fp) return 1;fputs("This is a line.\n", fp);  // 写入一行(我们手动加了换行)fclose(fp);return 0;
}

3. fputc —— 写一个字符

函数原型:

int fputc(int character, FILE *stream);
  • character:要写入的字符(注意是 int 类型,但只写入低 8 位)。
  • stream:目标文件指针。

代码举例:

#include <stdio.h>int main() {FILE *fp = fopen("output.txt", "w");  // 打开文件写入if (!fp) return 1;fputc('A', fp);  // 写入字符 Afputc('\n', fp);  // 写入换行符fclose(fp);return 0;
}

总结:

函数类型作用使用场景
fread读取读取二进制数据图片、音频等非文本文件
fgets读取读取一行字符串文本文件(逐行读)
fgetc读取读取一个字符逐个字符分析文件
fscanf读取按格式读取文本数据(如姓名、数字)
fwrite写入写入二进制数据保存图片、日志
fputs写入写入字符串写入一行或多行文本
fputc写入写入一个字符控制字符写入(逐个字符)

相关文章:

  • Java学习手册:服务注册与发现
  • Mask-aware Pixel-Shuffle Down-Sampling (MPD) 下采样
  • Java对象的内存分布(二)
  • 数组的常用方法
  • TikTok 互动运营干货:AI 助力提升粘性
  • 理解CNN模型:从原理到应用
  • 程序中的内存从哪里来?
  • 【第三十五周】Janus-pro 技术报告阅读笔记
  • VSCode连接Overleaf失败解决办法
  • GET请求和POST请求的区别
  • 在 C++中,指针数组与数组指针的区别
  • 代码随想录笔记---回溯篇
  • OrangePi Zero 3学习笔记(Android篇)6 - hid-ft260
  • 解决SSH连接华为云服务器ESC经常性断连问题
  • 单链表C语言实现(付代码全)
  • 牛客周赛 Round 92 题解 Java
  • 当虚拟吞噬现实——《GTA6》结合技术
  • Java 线程池原理
  • Http2多路复用的静态表和动态表
  • 假如你的项目是springboot+vue怎么解决跨域问题
  • 火车站员工迟到,致出站门未及时开启乘客被困?铁路部门致歉
  • 《单身情歌》制作人韩贤光去世,林志炫发文悼念
  • 撤制镇如何突破困境?欢迎订阅《澎湃城市报告》第23期
  • 中美经贸高层会谈11日在日内瓦将继续进行
  • 侧记|青年为何来沪创新创业?从这一天寻找答案
  • 祝贺!苏翊鸣成功解锁“2160”