C语言文件操作:标准库与系统调用实践
目录
1、C语言标准库文件操作
1.1.题目要求:
1.2.函数讲解:
fopen
函数原型
参数
常用的打开模式
返回值
fwrite函数
函数原型
参数
返回值
注意事项
fseek函数
函数原型
参数
返回值
fread函数
函数原型
参数
返回值
fclose 函数
函数原型
参数
返回值
1.3.代码:
2、系统调用文件操作
2.1.作业内容
2.2.函数讲解
open 函数
函数原型
参数
返回值
write函数
函数原型
参数
返回值
read 函数
1. 函数原型
2. 参数
3. 返回值
2.3.代码:
运行效果:

1、C语言标准库文件操作
1.1.题目要求:
1.考察fopen, fread, fwrite, fseek, fclose等函数的使用
2.要求:
2.1使用代码打开当前路径下的“bite”文件(如果文件不存在在创建文件),向文件当中写入“linux so easy!”.
2.2 在从文件当中读出文件当中的内容, 打印到标准输出当中; 关闭文件流指针
1.2.函数讲解:
fopen
fopen 是 C 语言标准库中的一个函数,用于打开文件,并返回一个指向 FILE 结构的指针,该指针用于后续的文件操作。如果文件打开失败,fopen 会返回 NULL。
函数原型
FILE *fopen(const char *filename, const char *mode); |
参数
filename:要打开的文件的名称(包括路径,如果文件不在当前目录下)。mode:打开文件的模式,决定了文件是以只读、只写、读写、追加等哪种方式被打开。模式字符串还可以包含字符b,表示以二进制模式打开文件(在 Windows 上很重要,因为 Windows 默认以文本模式打开文件,可能会对换行符进行转换)。
常用的打开模式
"r":只读模式。文件必须存在。"w":只写模式。如果文件存在,其内容会被清空;如果文件不存在,会创建新文件。"a":追加模式。如果文件存在,写入的数据会被追加到文件末尾;如果文件不存在,会创建新文件。"r+":读写模式。文件必须存在。"w+":读写模式。如果文件存在,其内容会被清空;如果文件不存在,会创建新文件。"a+":读写模式。如果文件存在,写入的数据会被追加到文件末尾,同时允许读取文件;如果文件不存在,会创建新文件。
返回值
- 成功时,返回一个指向
FILE结构的指针,该指针用于后续的文件操作。 - 失败时,返回
NULL,并设置全局变量errno以指示错误类型。
fwrite函数
fwrite 函数是 C 语言标准库中的一个函数,用于将数据从内存写入到文件中。它是文件 I/O(输入/输出)操作的一部分,常用于二进制文件的写入。
函数原型
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); |
参数
ptr:指向要写入文件的数据的指针。这通常是一个数组或内存块的地址。size:每个数据项的大小(以字节为单位)。nmemb:要写入的数据项的数量。stream:指向FILE结构的指针,该指针标识了目标文件流。这个指针通常是通过fopen函数获得的。
返回值
- 成功时,返回实际写入的数据项的数量。这个值通常与
nmemb相同,除非在写入过程中发生了错误或到达了文件末尾(对于非阻塞 I/O 或某些特殊设备文件,这可能会发生)。 - 失败时,返回一个小于
nmemb的值,并且会设置全局变量errno以指示错误类型。然而,对于普通的文件写入操作,fwrite通常要么成功写入所有请求的数据项,要么在遇到不可恢复的错误时返回 0。
注意事项
fwrite并不保证将数据实际写入到物理存储设备上;它只是将数据写入到文件系统的缓冲区中。为了确保数据被持久化,你可能需要调用fflush函数来刷新输出缓冲区,或者在文件关闭后依赖操作系统的自动刷新机制。- 在写入二进制文件时,使用
"wb"模式打开文件是很重要的,其中"b"表示二进制模式。这可以防止在某些操作系统(如 Windows)上对换行符进行不必要的转换。 - 如果
fwrite返回的值小于nmemb,你应该检查errno来确定是否发生了错误,并采取相应的错误处理措施。
fseek函数
fseek 函数是 C 语言标准库中的一个函数,用于在文件中定位流的位置。它允许你根据指定的起始点和偏移量来移动文件内部的位置指针,从而实现对文件的随机访问。
函数原型
c复制代码
int fseek(FILE *stream, long int offset, int whence); |
参数
stream:指向FILE结构的指针,该指针标识了目标文件流。这个指针通常是通过fopen函数获得的。offset:要移动的字节数。整数表示正向移动,负数表示负向移动。whence:指定起始位置的参数,决定了offset是相对于哪个位置进行移动的。它可以是以下三个常量之一:SEEK_SET:文件的开头。此时offset应为正数或零。SEEK_CUR:文件的当前位置。此时offset可以是正数(向前移动)或负数(向后移动)。SEEK_END:文件的末尾。此时offset通常为负数(向前移动),因为文件末尾之后没有数据可以正向移动。
返回值
- 成功时,返回 0。
- 失败时,返回非零值,并设置全局变量
errno以指示错误类型。常见的错误包括无效的流指针、无效的起始点参数,或试图移动到一个无效的文件位置(如负位置或超出文件大小的位置)。
fread函数
fread 函数是 C 语言标准库中的一个函数,用于从文件中读取数据到内存中。它是文件 I/O(输入/输出)操作的一部分,常用于二进制文件的读取。
函数原型
c
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); |
参数
ptr:指向内存块的指针,该内存块用于存储从文件中读取的数据。这通常是一个数组的地址。size:每个数据项的大小(以字节为单位)。nmemb:要读取的数据项的数量。stream:指向FILE结构的指针,该指针标识了源文件流。这个指针通常是通过fopen函数获得的。
返回值
- 成功时,返回实际读取的数据项的数量。这个值可能小于
nmemb,如果到达了文件末尾或发生了其他读取错误(尽管对于普通的文件读取操作,fread通常要么成功读取所有请求的数据项,要么在遇到文件末尾时返回实际读取的项数,要么在发生不可恢复的错误时返回 0)。 - 失败时(即返回 0 且不是由于到达文件末尾),返回 0,并设置全局变量
errno以指示错误类型。
fclose 函数
是 C 语言标准库中的一个函数,用于关闭一个打开的文件流,并释放与该文件流相关的资源。它是文件 I/O(输入/输出)操作的一部分,通常在完成对文件的读写操作后调用。
函数原型
c复制代码
int fclose(FILE *stream); |
参数
stream:指向FILE结构的指针,该指针标识了要关闭的文件流。这个指针通常是通过fopen、freopen或tmpfile函数获得的。
返回值
- 成功时,返回 0。
- 失败时,返回 EOF(通常定义为 -1),并设置全局变量
errno以指示错误类型。常见的错误包括无效的流指针或底层 I/O 错误。
1.3.代码:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>int main() {// 文件指针FILE *file;// 要写入文件的内容const char *contentToWrite = "linux so easy!";// 分配一个缓冲区来存储从文件中读取的内容char buffer[256];// 2.1 打开(或创建)文件file = fopen("bite", "w+"); // "w+" 模式表示读写,如果文件不存在则创建if (file == NULL) {perror("Error opening file");return EXIT_FAILURE;}// 写入内容到文件size_t bytesWritten = fwrite(contentToWrite, sizeof(char), strlen(contentToWrite), file);if (bytesWritten != strlen(contentToWrite)) {perror("Error writing to file");fclose(file);return EXIT_FAILURE;}// 将文件指针重置到文件开头,以便读取if (fseek(file, 0, SEEK_SET) != 0) {perror("Error seeking in file");fclose(file);return EXIT_FAILURE;}// 从文件中读取内容size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer) - 1, file);if (ferror(file)) {perror("Error reading from file");fclose(file);return EXIT_FAILURE;}// 确保字符串以null字符结尾buffer[bytesRead] = '\0';// 打印读取到的内容到标准输出printf("Read from file: %s\n", buffer);// 关闭文件if (fclose(file) != 0) {perror("Error closing file");return EXIT_FAILURE;}return EXIT_SUCCESS;
}
2、系统调用文件操作
2.1.作业内容
1.考察open, read, write, lseek, close等函数的使用。同时理解文件描述符
2.要求:
2.1 使用代码打开当前路径下的“bite”文件(如果文件不存在在创建文件),向文件当中写入“i like linux!”.
2.2 在从文件当中读出文件当中的内容, 打印到标准输出当中; 关闭文件描述符
2.2.函数讲解
open 函数
是 Unix 和类 Unix 操作系统(如 Linux 和 macOS)中用于打开和可能创建文件的系统调用或库函数。在 C 语言编程中,它通常通过 <fcntl.h> 头文件声明,并用于返回一个文件描述符,该描述符用于后续的文件操作,如读取、写入和文件定位。
函数原型
在 POSIX 标准中,open 函数的原型如下:
c复制代码
#include <fcntl.h> | |
#include <sys/types.h> | |
#include <sys/stat.h> | |
#include <unistd.h> | |
int open(const char *pathname, int flags, mode_t mode); |
参数
pathname:要打开或创建的文件的路径名。flags:用于指定打开文件时的行为的一组标志。这些标志可以单独使用,也可以通过按位或(|)运算符组合使用。常见的标志包括:O_RDONLY:以只读方式打开文件。O_WRONLY:以只写方式打开文件。O_RDWR:以读写方式打开文件。O_CREAT:如果文件不存在,则创建文件。使用此标志时,必须提供mode参数。O_TRUNC:如果文件已存在且为写模式打开,则将其长度截断为 0。O_APPEND:以追加模式打开文件。写入的数据将添加到文件末尾,而不是覆盖现有数据。- 其他标志,如
O_EXCL(与O_CREAT一起使用时,如果文件已存在,则调用失败)和O_NONBLOCK(用于非阻塞 I/O 操作)等。
mode:设置文件权限(当使用O_CREAT标志时)。这是一个mode_t类型的值,通常使用八进制数表示,如0644(用户读写,组读,其他读)。
返回值
- 成功时,
open返回一个非负的文件描述符。 - 失败时,返回
-1,并设置全局变量errno以指示错误类型。
write函数
write 函数是 Unix 和类 Unix 操作系统(例如 Linux 和 macOS)中用于向文件或设备写入数据的系统调用。在 C 语言编程中,它通常通过 <unistd.h> 头文件声明,并接受一个文件描述符、一个指向要写入数据的指针以及要写入的数据量作为参数。
函数原型
c复制代码
#include <unistd.h> | |
ssize_t write(int fd, const void *buf, size_t count); |
参数
fd:要写入的文件的文件描述符,该描述符是通过open、dup、pipe、socket等系统调用获得的。buf:指向要写入数据的缓冲区的指针。count:要写入的数据的字节数。
返回值
- 成功时,
write返回实际写入的字节数。这个值可能小于请求写入的字节数(例如,如果磁盘已满或达到了文件大小限制)。 - 失败时,返回
-1,并设置全局变量errno以指示错误类型。
read 函数在不同的编程环境中具有不同的实现和用途,但通常都用于从某种数据源(如文件、套接字或内存缓冲区)读取数据。以下是关于 read 函数的一些通用信息和示例:
read 函数
在Unix和类Unix操作系统(如Linux)的C语言编程中,read 函数是一个系统调用,用于从文件描述符指向的文件或设备中读取数据。
1. 函数原型
解释
c复制代码
#include <unistd.h> | |
ssize_t read(int fd, void *buf, size_t count); |
2. 参数
fd:文件描述符,表示要读取的文件或设备。buf:指向缓冲区的指针,用于存储读取的数据。count:要读取的字节数。
3. 返回值
- 成功时,返回实际读取的字节数(可能小于请求的字节数,特别是在读取到文件末尾时)。
- 失败时,返回
-1,并设置全局变量errno以指示错误类型。
2.3.代码:
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define BUFFER_SIZE 1024int main()
{int fd;ssize_t bytesRead, bytesWritten;char buffer[BUFFER_SIZE];const char *text = "i like linux!";// 打开(或创建)“bite”文件,使用O_WRONLY | O_CREAT | O_TRUNC标志fd = open("bite", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (fd == -1){perror("打开文件失败");exit(EXIT_FAILURE);}// 写入文本到文件bytesWritten = write(fd, text, strlen(text));if (bytesWritten == -1){perror("写入文件失败");close(fd);exit(EXIT_FAILURE);}// 关闭并重新打开文件以读取close(fd);fd = open("bite", O_RDONLY);if (fd == -1){perror("重新打开文件失败");exit(EXIT_FAILURE);}// 读取文件内容并打印到标准输出bytesRead = read(fd, buffer, BUFFER_SIZE - 1);if (bytesRead == -1){perror("读取文件失败");close(fd);exit(EXIT_FAILURE);}// 确保字符串以null字符结尾buffer[bytesRead] = '\0';printf("文件内容: %s\n", buffer);// 关闭文件close(fd);return 0;
}
运行效果:

成功,并且也成功创建了文件bite

相关文章:
C语言文件操作:标准库与系统调用实践
目录 1、C语言标准库文件操作 1.1.题目要求: 1.2.函数讲解: fopen 函数原型 参数 常用的打开模式 返回值 fwrite函数 函数原型 参数 返回值 注意事项 fseek函数 函数原型 参数 返回值 fread函数 函数原型 参数 返回值 fclose 函数…...
代码随想录 栈与队列 test 7
347. 前 K 个高频元素 - 力扣(LeetCode) 首先想到哈希,用key来存元素,value来存出现次数,最后进行排序,时间复杂度约为o(nlogn)。由于只需求前k个,因此可以进行优化,利用堆来维护这…...
C语言练习(21)
有一行电文,已按下面规律译成密码: A→Za→Z B→Yb→y C→Xc→X 即第1个字母变成第26个字母,第2个字母变成第25个字母,第i个字母变成第(26-i十1)个字母。非字母字符不变。假如已知道密码是Umtorhs&…...
智能手机“混战”2025:谁将倒下而谁又将突围?
【潮汐商业评论原创】 “去年做手机比较艰难,几乎每个品牌都在调价、压货,像华为这种以前都不给我们分货的厂商,也开始成为我的主要库存。不过今年开头比较好,20号国补一开始,店里的人流和手机销量就明显涨了不少&…...
计算机图形学:实验一 OpenGL基本绘制
1.OpenGL的环境配置: 集成开发环境Visual Studio Community 2019的安装: 在Windows一栏选择使用C的桌面开发;再转到“单个组件”界面,在“编译器、生成工具和运行时”一栏选择用于“Windows的C CMake工具”;然后转到…...
二分查找题目:快照数组
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:快照数组 出处:1146. 快照数组 难度 7 级 题目描述 要求 实现支持下列接口的快照数组: SnapshotArray(int length) \textt…...
深度学习|表示学习|卷积神经网络|参数共享是什么?|07
如是我闻: Parameter Sharing(参数共享)是卷积神经网络(CNN)的一个重要特性,帮助它高效地处理数据。参数共享的本质就是参数“本来也没有变过”。换句话说,在卷积层中,卷积核的参数&…...
基于相机内参推导的透视投影矩阵
基于相机内参推导透视投影矩阵(splatam): M c a m [ 2 ⋅ f x w 0.0 ( w − 2 ⋅ c x ) w 0.0 0.0 2 ⋅ f y h ( h − 2 ⋅ c y ) h 0.0 0 0 f a r n e a r n e a r − f a r 2 f a r ⋅ n e a r n e a r − f a r 0.0 0.0 − 1.0 0.0 ] M_…...
浅析Dubbo 原理:架构、通信与调用流程
一、Dubbo 简介 Dubbo 是阿里巴巴开源的高性能、轻量级的 Java RPC(Remote Procedure Call,远程过程调用)框架,旨在实现不同服务之间的远程通信和调用。在分布式系统中,不同服务可能部署在不同的服务器上,D…...
03垃圾回收篇(D3_垃圾收集器的选择及相关参数)
目录 学习前言 一、收集器的选择 二、GC日志参数 三、垃圾收集相关的常用参数 四、内存分配与回收策略 1. 对象优先在Eden分配 2. 大对象直接进入老年代 3. 长期存活的对象将进入老年代 4. 动态对象年龄判定 5. 空间分配担保 学习前言 本章主要学习垃圾收集器的选择及…...
一、引论,《组合数学(第4版)》卢开澄 卢华明
零、前言 发现自己数数题做的很烂,重新学一遍组合数学吧。 参考卢开澄 卢华明 编著的《组合数学(第4版)》,只打算学前四章。 通过几个经典问题来了解组合数学所研究的内容。 一、幻方问题 据说大禹治水之前,河里冒出来一只乌龟,…...
Vue3+TS 实现批量拖拽文件夹上传图片组件封装
1、html 代码: 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性,可根据自己需求,在组件外部做调整 <template><div class"dragUpload"><el-dialo…...
二叉树的所有路径(力扣257)
因为题目要求路径是从上到下的,所以最好采用前序遍历。这样可以保证按从上到下的顺序将节点的值存入一个路径数组中。另外,此题还有一个难点就是如何求得所有路径。为了解决这个问题,我们需要用到回溯。回溯和递归不分家,每递归一…...
Python OrderedDict 实现 Least Recently used(LRU)缓存
OrderedDict 实现 Least Recently used(LRU)缓存 引言正文 引言 LRU 缓存是一种缓存替换策略,当缓存空间不足时,会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点: 有限容量:缓存拥有固定的…...
LabVIEW项目中的工控机与普通电脑选择
工控机(Industrial PC)与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异,并为LabVIEW项目中的选择提供指导。 硬件设…...
Ansys Speos | Speos Meshing 网格最佳实践
概述 网格划分是在各种计算应用中处理3D几何的基本步骤: 表面和体积:网格允许通过将复杂的表面和体积分解成更简单的几何元素(如三角形、四边形、四面体或六面体)来表示复杂的表面和体积。 模拟和渲染:网格是创建离散…...
elasticsearch segment数量对读写性能的影响
index.merge.policy.segments_per_tier 是一个配置选项,用于控制 Elasticsearch 中段(segment)合并策略的行为。它定义了在每一层的段合并过程中,允许存在的最大段数量。调整这个参数可以优化索引性能和资源使用。 假设你有一个索…...
全同态加密理论、生态现状与未来展望(中2)
《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布,分为上中下三个系列: 全同态加密理论、生态现状与未来展望(上):专注于介绍全同态加密理论知识。全同态加密…...
鸿蒙UI(ArkUI-方舟UI框架)-开发布局
返回主章节 → 鸿蒙UI(ArkUI-方舟UI框架) 开发布局 1、布局概述 1)布局结构 2)布局元素组成 3)如何选择布局 声明式UI提供了以下10种常见布局,开发者可根据实际应用场景选择合适的布局进行页面开发。 …...
RPC是什么?和HTTP区别?
RPC 是什么?HTTP 是什么? 作为一个程序员,假设我们需要从A电脑的进程发送一段数据到B电脑的进程,我们一般会在代码中使用 Socket 进行编程。 此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
