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 结构的指针,该指针标识了要关闭的文件流。这个指针通常是通过 fopenfreopen 或 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:要写入的文件的文件描述符,该描述符是通过 openduppipesocket 等系统调用获得的。
  • 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

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

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

相关文章

一款专业通用开源的MES生产执行管理系统

系统简介 MES系统是一款B/S结构、开源、免费的生产执行管理系统。 此系统基于本人多年离散智造行业的业务经验及J2EE项目经验开发。 主要目的是为国内离散制造业的中小企业提供一个专业化、通用性、低成本的MES系统解决方案。 系统将提供“售前”、“实施”、“用户培训”、…

SpringBoot集成Flink-CDC,实现对数据库数据的监听

一、什么是 CDC &#xff1f; CDC 是Change Data Capture&#xff08;变更数据获取&#xff09;的简称。 核心思想是&#xff0c;监测并捕获数据库的变动&#xff08;包括数据或数据表的插入、 更新以及删除等&#xff09;&#xff0c;将这些变更按发生的顺序完整记录下来&…

Three城市引擎地图插件Geo-3d

一、简介 基于Three开发&#xff0c;为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系&#xff0c;支持坐标转换&#xff0c;支持影像、地形、geojson建筑、道路&#xff0c;植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…

应用层协议 HTTP 讲解实战:从0实现HTTP 服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; HTTP 协议 &#x1f98b; 认识 URL&#x1f98b; urlencode 和 urldecode 二&#xff1a;&#x1f525; HTTP 协议请求与响应格式 &#x1f98b; HTTP 请求…

鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)

目录 ​1&#xff09;仓颉的SDK下载 1--进入仓颉的官网 2--点击图片中的下载按钮 3--在新跳转的页面点击即刻下载 4--下载 5--找到你们自己下载好的地方 6--解压软件 2&#xff09;仓颉编程环境配置 1--找到自己的根目录 2--进入命令行窗口 3--输入 envsetup.bat 4--验证是否安…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图&#xff0c;简单的代码&#xff0c;来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义&#xff1a;交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术&#xff0c;包括语音、视频图像等多媒体实时通信。 特点&#xff1a; 实时性&#xff1a;音频和视频数据是实时传输和播放的&#xff0c;用户之间可以进行即时的交流。交互…

【Linux系统】Linux下的图形库 ncurses(简单认识)

基本介绍 在 Linux 环境下&#xff0c;ncurses 是一个非常重要的库&#xff0c;用于编写可以在终端&#xff08;TTY&#xff09;或模拟终端窗口中运行的 字符界面程序。它提供了一套函数&#xff0c;使得开发者可以轻松地操作文本终端的显示&#xff0c;比如移动光标、创建窗口…

基于C#实现多线程启动停止暂停继续

大部分初学者在学习C#上位机编程时&#xff0c;多线程是一个很难逾越的鸿沟&#xff0c;不合理地使用多线程&#xff0c;会导致经常出现各种奇怪的问题&#xff0c;这也是很多初学者不敢使用多线程的原因。但是在实际开发中&#xff0c;多线程是一个不可避免的技术栈&#xff0…

ESP8266 MQTT服务器+阿里云

MQTT私有平台搭建&#xff08;EMQX 阿里云&#xff09; 阿里云服务器 EMQX 搭建私有MQTT平台 1、搜索EMQX开源版本 2、查看各版本EMQX支持的UBUNTU版本 3、查看服务器Ubuntu版本 4、使用APT安装模式 5、按照官网指示安装并启动 6、下载安装MQTTX测试工具 7、设置云服务…

Redis使用基础

1 redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务 ! 是完全开源的&#xff0c;遵守 BSD 协议&#xff0c;是一个高性能的 key-value 数据库。 使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并…

PostgreSQL主从复制配置

本文主要介绍基于pg_basebackup实现主从复制&#xff08;异步流复制&#xff09; MASTER节点安装的方法可以看这篇文章 PostgreSQL YUM安装_yum install postgresql-CSDN博客 关于基本的配置就不作过多的介绍了&#xff0c;直接开始 MASTER节点 首先在master节点创建一个用于…

2025 OWASP十大智能合约漏洞

随着去中心化金融&#xff08;DeFi&#xff09;和区块链技术的不断发展&#xff0c;智能合约安全的重要性愈发凸显。在此背景下&#xff0c;开放网络应用安全项目&#xff08;OWASP&#xff09;发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…

关于WPF中ComboBox文本查询功能

一种方法是使用事件&#xff08;包括MVVM的绑定&#xff09; <ComboBox TextBoxBase.TextChanged"ComboBox_TextChanged" /> 然而运行时就会发现&#xff0c;这个事件在疯狂的触发&#xff0c;很频繁 在实际应用中&#xff0c;如果关联查询数据库&#xff0…

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议

目录 前言 一、UDP网络编程 1.Qt项目文件 2.UDP类 QUdpSocket QNetworkDatagram 3.UDP回显服务器案例 细节 服务器设计 客户端设计 二、TCP网络编程 1.TCP类 QTcpServer QTcpSocket 2.TCP回显服务器案例 细节 服务器设计 客户端设计 三、HTTP客户端 1.HTTP…

【LeetCode】--- MySQL刷题集合

1.组合两个表&#xff08;外连接&#xff09; select p.firstName,p.lastName,a.city,a.state from Person p left join Address a on p.personId a.personId; 以左边表为基准&#xff0c;去连接右边的表。取两表的交集和左表的全集 2.第二高的薪水 &#xff08;子查询、if…

【2024年华为OD机试】(B卷,100分)- 数据分类 (Java JS PythonC/C++)

一、问题描述 题目描述 对一个数据a进行分类,分类方法为: 此数据a(四个字节大小)的四个字节相加对一个给定的值b取模,如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值;如果得到的结果大于或者等于c,则数据a为无效类型。 比如一个数据a=0x010…

Java 8 实战 书籍知识点散记

一、Lambda表达式 1.1 Lambda表达式的一些基本概念 1.2 Lambda表达式的三个部分 // 简化前Comparator<Apple> byWeightnew Comparator<Apple>() {public int compare(Apple a1, Apple a2){return a1.getWeight().compareTo(a2.getWeight());}};//Lambda表达式Comp…

大数据中 TopK 问题的常用套路

大数据中 TopK 问题的常用套路 作者 Chunel Feng&#xff0c;编程爱好者&#xff0c;阿里巴巴搜索引擎开发工程师。开源项目&#xff1a;Caiss 智能相似搜索引擎 对于海量数据到处理经常会涉及到 topK 问题。在设计数据结构和算法的时候&#xff0c;主要需要考虑的应该是当前算…

GPU算力平台|在GPU算力平台部署MedicalGPT医疗大模型的应用教程

文章目录 一、GPU算力服务平台云端GPU算力平台 二、平台账号注册流程MedicalGPT医疗大模型的部署MedicalGPT医疗大模型概述MedicalGPT部署步骤 一、GPU算力服务平台 云端GPU算力平台 云端GPU算力平台专为GPU加速计算设计&#xff0c;是一个高性能计算中心&#xff0c;广泛应用…