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 不…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...