Linux文件编程——标准库函数fopen、fread、fwrite等函数

1. fopen — 打开文件

函数原型:
FILE *fopen(const char *filename, const char *mode);
参数:
  • filename:要打开的文件名,可以是相对路径或绝对路径。

  • mode:文件打开模式,表示文件的操作方式(如只读、写入、追加等)。

常见的打开模式:
  • "r":只读模式,文件必须存在。

  • "w":只写模式,如果文件存在会清空文件,不存在则创建。

  • "a":追加模式,文件不存在则创建,写入时数据会追加到文件末尾。

  • "r+":读写模式,文件必须存在。

  • "w+":读写模式,文件存在则清空,不存在则创建。

  • "a+":读写模式,文件不存在则创建,数据追加到文件末尾。

返回值:
  • 如果成功,返回一个指向文件的指针(FILE *)。

  • 如果失败,返回 NULL,通常使用 perror()errno 获取错误信息。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("无法打开文件");return 1;
}
注意事项:
  • fopen 只支持文本文件和二进制文件的打开,打开方式非常灵活,可以通过不同的模式选择合适的文件操作。

  • 打开文件后,应确保及时关闭文件,使用 fclose()

  • fopen 函数会自动创建文件指针,并为文件分配缓冲区。


2. fread — 从文件读取数据

函数原型:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
参数:
  • ptr:指向要存储读取数据的内存缓冲区。

  • size:每个元素的字节数(通常为 sizeof(type))。

  • count:要读取的元素数量。

  • stream:文件指针,表示要读取的文件。

返回值:
  • 返回实际读取的元素数量。如果返回值小于 count,表示可能发生了错误或到达了文件末尾(EOF)。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("无法打开文件");return 1;
}char buffer[100];
size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), fp);
if (bytesRead > 0) {printf("读取到的内容: %s\n", buffer);
}
fclose(fp);
注意事项:
  • fread 是基于缓冲区的读取,性能较高,适合读取大块数据。

  • 读取时要确保 ptr 的内存空间足够容纳读取的数据。

  • fread 适用于二进制数据的读取。如果是读取文本数据,最好使用 fgets

  • fread 读取时并不会自动添加字符串终止符 \0,如果读取的是字符串,需手动添加。


3. fwrite — 向文件写入数据

函数原型:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
参数:
  • ptr:指向要写入的数据的内存缓冲区。

  • size:每个元素的字节数(通常为 sizeof(type))。

  • count:要写入的元素数量。

  • stream:文件指针,表示要写入的文件。

返回值:
  • 返回实际写入的元素数量。如果返回值小于 count,表示可能发生了错误。

示例:
FILE *fp = fopen("output.txt", "w");
if (fp == NULL) {perror("无法打开文件");return 1;
}const char *data = "Hello, World!";
size_t bytesWritten = fwrite(data, sizeof(char), strlen(data), fp);
if (bytesWritten != strlen(data)) {perror("写入文件失败");
}
fclose(fp);
注意事项:
  • fwrite 会自动使用缓冲区,提高性能。

  • 使用 fwrite 时应确保数据类型和缓冲区大小正确。通常用于写入二进制数据。

  • fwrite 也不会在写入的数据末尾自动添加字符串结束符 \0,需根据实际需求手动处理。


4. fseek — 设置文件指针的位置

函数原型:
int fseek(FILE *stream, long int offset, int whence);
参数:
  • stream:文件指针。

  • offset:从 whence 指定的起始位置开始的偏移量。

  • whence:起始位置的标志,常用的值包括:

    • SEEK_SET:文件开头。

    • SEEK_CUR:当前位置。

    • SEEK_END:文件末尾。

返回值:
  • 成功时返回 0,失败时返回非零值。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("无法打开文件");return 1;
}fseek(fp, 0, SEEK_END);  // 定位到文件末尾
long fileSize = ftell(fp);  // 获取文件大小
printf("文件大小: %ld 字节\n", fileSize);fseek(fp, 0, SEEK_SET);  // 重置文件指针到文件开头
fclose(fp);
注意事项:
  • fseek 可以改变文件指针的位置,在读取或写入时可以灵活地控制文件位置。

  • fseekftell 配合使用,能够实现文件大小的获取。

  • 使用时要注意文件是否已正确打开,并且文件指针的偏移量是否合理。


5. fclose — 关闭文件

函数原型:
int fclose(FILE *stream);
参数:
  • stream:要关闭的文件指针。

返回值:
  • 成功时返回 0,失败时返回 EOF。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("无法打开文件");return 1;
}fclose(fp);  // 关闭文件
注意事项:
  • 必须关闭文件:每次打开文件后,使用完文件后必须调用 fclose() 关闭文件,释放资源。

  • fclose() 会刷新文件的缓冲区,如果有未写入的数据,会被强制写入文件。

  • 在程序结束时忘记关闭文件可能会导致内存泄漏或资源占用。


6. fputc — 向文件写入一个字符

函数原型:
int fputc(int character, FILE *stream);
参数:
  • character:要写入的字符。注意,这里传入的是一个整数类型(通常是 char 的 ASCII 值),而不是字符本身,因此需要使用字符类型转换。

  • stream:文件指针,指向目标文件。

返回值:
  • 如果写入成功,返回写入的字符(转换为 unsigned char)。

  • 如果写入失败,返回 EOF

示例:
#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "w");if (fp == NULL) {perror("无法打开文件");return 1;}fputc('H', fp);  // 向文件中写入字符 'H'fputc('i', fp);  // 向文件中写入字符 'i'fclose(fp);  // 关闭文件return 0;
}
注意事项:
  • fputc 只能写入单个字符。写入多个字符时,需要多次调用 fputc

  • fputc 写入时不会自动添加换行符,必须手动写入(如 fputc('\n', fp))。

  • 如果写入过程中发生错误,fputc 返回 EOF,可以通过 perror 或检查文件指针的状态进行处理。


7. fgetc — 从文件读取一个字符

函数原型:
int fgetc(FILE *stream);
参数:
  • stream:文件指针,指向要读取的文件。

返回值:
  • 成功时,返回读取的字符(以 unsigned char 形式返回,但作为 int 类型)。

  • 如果读取到文件结束符(EOF),返回 EOF

  • 如果发生读取错误,也会返回 EOF

示例:
#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");if (fp == NULL) {perror("无法打开文件");return 1;}int ch;while ((ch = fgetc(fp)) != EOF) {  // 逐个字符读取文件内容putchar(ch);  // 输出字符}fclose(fp);  // 关闭文件return 0;
}
注意事项:
  • fgetc 一次读取一个字符,适用于逐字符读取文件。

  • 在读取时,fgetc 会返回字符的 ASCII 值。如果遇到文件结束符(EOF),则停止读取。

  • 使用 fgetc 时要注意检查返回值,EOF 可能意味着文件结束或读取错误,因此应及时检查并处理。


8. feof — 检查是否到达文件末尾

函数原型:
int feof(FILE *stream);
参数:
  • stream:文件指针,指向要检查的文件。

返回值:
  • 如果文件指针已到达文件末尾,返回非零值(通常是 1)。

  • 如果文件指针尚未到达文件末尾,返回 0

示例:
#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");if (fp == NULL) {perror("无法打开文件");return 1;}int ch;while ((ch = fgetc(fp)) != EOF) {putchar(ch);  // 输出字符}if (feof(fp)) {printf("\n已到达文件末尾。\n");}fclose(fp);  // 关闭文件return 0;
}
注意事项:
  • feof 在文件读取时用来检查是否已到达文件末尾,它不会主动读取文件内容,因此最好在文件读取后使用(如通过 fgetcfread 等函数)。

  • 不要在 fgetcfread 等读取函数调用前检查 feof,因为 feof 只能判断是否到达文件末尾,而不是预测读取是否成功。正确的做法是在读取失败或读取结束后再检查 feof

总结

  • fopen:用于打开文件,返回文件指针,可以设置文件的打开模式。

  • fread:用于从文件中读取数据,适用于读取二进制数据。

  • fwrite:用于将数据写入文件,适用于写入二进制数据。

  • fseek:用于设置文件指针的位置,可以在文件内部进行定位。

  • fclose:关闭文件,释放资源,确保数据写入完成。

  • fputc:用于写入单个字符,适合逐个字符地写入文件。如果要写入多个字符,可以多次调用 fputc,或者使用 fwrite

  • fgetc:用于读取单个字符。返回值是一个 int 类型,用于区分普通字符与 EOF(文件结束符)。

  • feof:用于检查文件是否已到达末尾,但不能在读取文件时直接判断文件是否结束。通常在文件读取结束后,检查 feof 是否为真,来判断是否到达文件末尾。

使用注意事项:

  1. 每次打开文件后,必须使用 fclose() 关闭文件,防止资源泄漏。

  2. freadfwrite 操作时不会自动添加字符串结束符 \0,需要手动处理。

  3. 对于文本文件,使用 fopenfreadfwrite 等标准库函数进行文件操作,适用于大多数应用场景;对于高效、底层的文件操作,可以使用 openreadwrite 等系统调用。

  4. 调用 fseek 时要确保文件指针在有效范围内。

  5. fgetc读取文件时,要根据返回值判断是否读取到文件结束。

  6. feof 仅用于检测文件末尾,而不是读取是否成功。建议在 fgetcfread 读取后检查 feof

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 Git 到 GitHub - 使用 Git 进行版本控制 - Git 常用命令

希望本贴能从零开始带您一起学习如何使用 Git 进行版本控制&#xff0c;并结合远程仓库 GitHub。这会是一个循序渐进的指南&#xff0c;我们开始吧&#xff01; 学习 Git 和 GitHub 的路线图&#xff1a; 理解核心概念&#xff1a;什么是版本控制&#xff1f;Git 是什么&…

2025.05.11拼多多机考真题算法岗-第四题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 04. 记忆碎片重组 问题描述 卢小姐正在开发一款名为"记忆碎片"的游戏,玩家需要分析混乱的记忆数据,推测出形成这些记忆的原始序列。游戏中,记忆数据存储在一个特殊的数…

Android Exoplayer多路不同时长音视频混合播放

在上一篇Android Exoplayer 实现多个音视频文件混合播放以及音轨切换中我们提到一个问题&#xff0c;如果视频和音频时长不一致&#xff0c;特别是想混合多个音频和多个视频时就会出问题&#xff0c;无法播放。报错如下&#xff1a; E/ExoPlayerImplInternal(11191): Playback…

Datawhale PyPOTS时间序列5月第1次笔记

课程原地址&#xff1a; https://github.com/WenjieDu/PyPOTS&#xff08;Package地址&#xff09; https://github.com/WenjieDu/BrewPOTS/tree/datawhale/202505_datawhale&#xff08;Tutorial地址&#xff09; 2.1 PyPOTS简介 PyPOTS 是一个专为处理部分观测时间序列&a…

网安学途—流量分析 attack.pcap

attack.pacp 使用Wireshark查看并分析虚拟机windows 7桌面下的attack.pcapng数据包文件&#xff0c;通过分析数据包attack.pcapng找出黑客的IP地址&#xff0c;并将黑客的IP地址作为FLAG &#xff08;形式&#xff1a;[IP地址]&#xff09;提交&#xff1a; 过滤器筛选&#x…

【大模型】DeepResearcher:通用智能体通过强化学习探索优化

DeepResearcher&#xff1a;通过强化学习在真实环境中扩展深度研究 一、引言二、技术原理&#xff08;一&#xff09;强化学习与深度研究代理&#xff08;二&#xff09;认知行为的出现&#xff08;三&#xff09;模型架构 三、实战运行方式&#xff08;一&#xff09;环境搭建…

go语言实现IP归属地查询

效果: 实现代码main.go package mainimport ("encoding/json""fmt""io/ioutil""net/http""os" )type AreaData struct {Continent string json:"continent"Country string json:"country"ZipCode …

基于STM32、HAL库的SGTL5000XNLA3R2音频接口芯片驱动程序设计

一、简介: SGTL5000XNLA3R2 是 Cirrus Logic 推出的高性能、低功耗音频编解码器,专为便携式和电池供电设备设计。它集成了立体声 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二…

window 显示驱动开发-报告图形内存(一)

计算图形内存 在 VidMm 能够向客户端报告准确的帐户之前&#xff0c;它必须首先计算图形内存的总量。 VidMm 使用以下内存类型和公式来计算图形内存&#xff1a; 系统总内存 此值是操作系统可访问的系统内存总量。 BIOS 分配的内存不会出现在此数字中。 例如&#xff0c;一台…

[FA1C4] 博客链接

Blog Link 博客已经从 CSDN 转移 高情商&#xff1a;博客是给人看的 低情商&#xff1a;CSDN 已经烂了根本不能看 链接: https://fa1c4.github.io/

python通过curl访问deepseek的API调用案例

废话少说&#xff0c;开干&#xff01; API申请和充值 下面是deepeek的API网站 https://platform.deepseek.com/ 进去先注册&#xff0c;是不是手机账号密码都不重要&#xff0c;都一样&#xff0c;完事充值打米&#xff0c;主要是打米后左侧API Keys里面创建一个API Keys&am…

【计算机视觉】OpenCV项目实战:基于face_recognition库的实时人脸识别系统深度解析

基于face_recognition库的实时人脸识别系统深度解析 1. 项目概述2. 技术原理与算法设计2.1 人脸检测模块2.2 特征编码2.3 相似度计算 3. 实战部署指南3.1 环境配置3.2 数据准备3.3 实时识别流程 4. 常见问题与解决方案4.1 dlib安装失败4.2 人脸检测性能差4.3 误识别率高 5. 关键…

第6章: SEO与交互指标

第6章: SEO与交互指标 在当今的SEO环境中&#xff0c;Google越来越重视用户交互指标&#xff0c;如页面停留时长、交互性能等。本章将深入探讨如何优化网页速度和用户交互体验&#xff0c;以提升SEO效果和用户满意度。 1. Google的新时代SEO指标 随着互联网技术的发展&#xff…

Starrocks的主键表涉及到的MOR Delete+Insert更新策略

背景 写这个文章的作用主要是做一些总结和梳理&#xff0c;特别是正对大数据场景下的实时写入更新策略 COW 和 MOR 以及 DeleteInsert 的技术策略的演进&#xff0c; 这也适用于其他大数据的计算存储系统。该文章主要参考了Primary Key table. 分析总结 Starrocks 的主键表主…

C 语言_常见排序算法全解析

排序算法是计算机科学中的基础内容,本文将介绍 C 语言中几种常见的排序算法,包括实现代码、时间复杂度分析、适用场景和详细解析。 一、冒泡排序(Bubble Sort) 基本思想:重复遍历数组,比较相邻元素,将较大元素交换到右侧。 代码实现: void bubbleSort(int arr[], i…

JIT+Opcache如何配置才能达到性能最优

首先打开php.ini文件&#xff0c;进行配置 1、OPcache配置 ; 启用OPcache opcache.enable1; CLI环境下启用OPcache&#xff08;按需配置&#xff09; opcache.enable_cli0; 预加载脚本&#xff08;PHP 7.4&#xff0c;加速常用类&#xff09; ; opcache.preload/path/to/prel…

Python训练打卡Day23

机器学习管道 pipeline 基础概念 pipeline在机器学习领域可以翻译为“管道”&#xff0c;也可以翻译为“流水线”&#xff0c;是机器学习中一个重要的概念。 在机器学习中&#xff0c;通常会按照一定的顺序对数据进行预处理、特征提取、模型训练和模型评估等步骤&#xff0c;以…

GPU SIMT架构的极限压榨:PTX汇编指令级并行优化实践

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、SIMT架构的调度哲学与寄存器平衡艺术 1.1 Warp Scheduler的调度策略解构 在NVIDIA GPU…

HarmonyOS 【诗韵悠然】AI古诗词赏析APP开发实战从零到一系列(二、项目准备与后台服务搭建)

在开发一款面向HarmonyOS平台的应用程序——【诗韵悠然】AI古诗词赏析APP时&#xff0c;选择了流行Go语言作为后端开发语言&#xff0c;并使用了go-zero微服务框架来搭建服务接口。本文将详细介绍项目准备和后台服务搭建的过程&#xff0c;帮助大家更好地理解和掌握go-zero框架…

QT5.14安装以及新建基础项目

进入qt中文网站&#xff1a;Qt | 软件开发全周期的各阶段工具 额&#xff0c;考虑新手可能还是找不到&#xff0c;我就分享一下我下载的的吧 通过网盘分享的文件&#xff1a;qt-opensource-windows-x86-5.14.2.exe 链接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…