【C语言】基础语法7:文件操作

news2024/9/23 11:24:53

上一篇:字符串和字符处理


❤️‍🔥前情提要❤️‍🔥
  欢迎来到C语言基本语法教程
  在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发,在之后的教程中将会不断学习并详细讲解C语言的基本语法及其高级用法
  上一节讲了C语言基础中的字符串和字符处理,接下来让我们来一起学习C语言中的文件操作

请添加图片描述

  🍪本教程内容干货满满,跟上步伐吧~🍪


作者介绍

🎓 作者:某不知名编程爱好者📜
🗒️系列文章&专栏推荐: 🔗《华为机试题解析》 、🔗《C语言程序设计》、🔗 《MySQL数据库》
🕸️为大家推荐一款很好用的C语言刷题网站🔗点击跳转


🔖导航小助手🔖

  • 📑 文件操作
  • 📑 1. 打开文件和关闭文件
  • 📑 2. 读写文件
    • 🌰 文件读写示例程序
  • 📑 3. 文件指针位置
  • 📑 4. 文件错误处理
  • 📑 5. 文件属性操作
  • 📑 6. 文件目录操作
    • 🌰 文件操作实例
  • 📑 7. 文件操作性能优化
  • 📑 8. 文件操作常见问题解决方案
  • ⚠️ 注意事项
    • 🎀小结


📑 文件操作

  • 文件是计算机存储设备上存储数据的一种方式。文件操作是指C语言程序通过对文件进行读、写等操作,来实现数据存储读取的功能。文件操作主要包括文件的打开读写关闭文件指针位置错误处理文件属性操作文件目录操作等。

📑 1. 打开文件和关闭文件

在进行文件操作之前,需要先打开文件。可以使用fopen函数打开文件,使用fclose函数关闭文件。fopen函数的原型如下:

FILE *fopen(const char *filename, const char *mode);

具体用法如下:

FILE* fp; // 文件指针
fp = fopen("filename.txt", "mode"); // 打开 filename.txt 文件,mode 表示打开模式
if (fp == NULL) {
    printf("文件打开失败!\n");
    return -1;
}
// TODO: 操作文件
fclose(fp); // 关闭文件

其中,filename参数表示要打开的文件名mode参数表示打开文件的模式。mode参数有以下几种:

  • r:只读模式,如果文件不存在则打开失败。
  • w:只写模式,如果文件不存在则创建文件,如果文件已经存在,则清除原有内容。
  • a:附加模式,若文件不存在则创建文件,若文件已经存在,则在文件末尾追加新内容。
  • rb:二进制格式下的只读模式。
  • wb:二进制格式下的只写模式。
  • ab:二进制格式下的附加模式。

fopen函数返回一个指向FILE结构体的指针,可以通过该指针进行文件操作。使用完文件后,需要通过fclose函数关闭文件,fclose函数的原型如下:

int fclose(FILE *stream);

stream参数表示要关闭的文件指针


📑 2. 读写文件

在打开文件之后,可以使用freadfwrite函数进行文件读写操作。fread函数的原型如下:

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

ptr参数表示要读入的数据存储位置size参数表示要读入的数据单个数据块的大小count参数表示要读入的数据块数量stream参数表示要读取的文件指针fread函数返回实际读取的数据块数量

fwrite函数的原型如下:

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

ptr参数表示要写入的数据存储位置size参数表示要写入的数据单个数据块的大小count参数表示要写入的数据块数量stream参数表示要写入的文件指针fwrite函数返回实际写入的数据块数量

具体用法如下:

FILE* fp; // 文件指针
char line[MAX_LINE_LENGTH]; // 缓冲区
// 打开文件
fp = fopen("filename.txt", "r");
if (fp == NULL) {
    printf("文件打开失败!\n");
    return -1;
}
// 读取文件内容
while (fgets(line, MAX_LINE_LENGTH, fp)) {
    printf("%s", line);
}
// 关闭文件
fclose(fp);

MAX_LINE_LENGTH指定了缓冲区的最大长度。

文件写入使用fprintf()fputs()函数进行。具体用法如下:

FILE* fp; // 文件指针
// 打开文件
fp = fopen("filename.txt", "w");
if (fp == NULL) {
    printf("文件打开失败!\n");
    return -1;
}
// 写入文件内容
fprintf(fp, "Hello, World!\n");
fputs("This is a test file.\n", fp);
// 关闭文件
fclose(fp);

🌰 文件读写示例程序

下面是一个完整的示例程序,演示了如何打开读取写入文件

#include <stdio.h>

#define MAX_LINE_LENGTH 1024

int main() {
    FILE* fp; // 文件指针
    char line[MAX_LINE_LENGTH]; // 缓冲区
    // 打开文件
    fp = fopen("example.txt", "w");
    if (fp == NULL) {
        printf("文件打开失败!\n");
        return -1;
    }
    // 写入文件内容
    fprintf(fp, "Hello, World!\n");
    fputs("This is a test file.\n", fp);
    // 关闭文件
    fclose(fp);
    // 打开文件
    fp = fopen("example.txt", "r");
    if (fp == NULL) {
        printf("文件打开失败!\n");
        return -1;
    }
    // 读取文件内容
    while (fgets(line, MAX_LINE_LENGTH, fp)) {
        printf("%s", line);
    }
    // 关闭文件
    fclose(fp);
    return 0;
}

📑 3. 文件指针位置

在使用freadfwrite函数进行文件读写操作时,需要注意文件指针的位置。文件指针用于表示读写数据时的位置,可以使用ftellfseek函数进行文件指针位置操作。ftell函数的原型如下:

long int ftell(FILE *stream);

stream参数表示要获取位置的文件指针,返回该文件指针的当前位置。

fseek函数的原型如下:

int fseek(FILE *stream, long int offset, int origin);

stream参数表示要进行指针操作的文件指针,offset参数表示要移动的字节数,origin参数表示移动方式,有以下几种:

  • SEEK_SET:从文件头开始偏移
  • SEEK_CUR:从当前位置偏移
  • SEEK_END:从文件末尾开始偏移

📑 4. 文件错误处理

在进行文件操作时,可能会遇到一些错误,如文件不存在文件只读等。在C语言中可以使用ferrorfeof函数进行错误处理。ferror函数的原型如下:

int ferror(FILE *stream);

stream参数表示要检测的文件指针,返回非零值表示文件操作发生了错误

feof函数的原型如下:

int feof(FILE *stream);

stream参数表示要检测的文件指针,返回非零值表示已经到达文件结尾


📑 5. 文件属性操作

使用fstat函数获取文件的属性信息。fstat函数的原型如下:

int fstat(int fd, struct stat *buf);

fd参数表示要获取属性信息的文件指针,buf参数表示存储文件属性信息的结构体指针。文件属性信息包括文件大小、创建时间、修改时间等。


📑 6. 文件目录操作

使用opendirreaddir函数进行文件目录操作。opendir函数的原型如下:

DIR *opendir(const char *name);

name参数表示要打开的目录路径,返回一个指向DIR结构体的指针。

readdir函数的原型如下:

struct dirent *readdir(DIR *dirp);

dirp参数表示要读取的目录指针,返回一个指向dirent结构体的指针,其中包括读取到的文件名等信息。


🌰 文件操作实例

以下是一个文件操作的实例代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    char buffer[80];

    /* 打开文件 */
    fp = fopen("test.txt", "w");

    /* 写入数据 */
    fprintf(fp, "Hello, World!");

    /* 关闭文件 */
    fclose(fp);

    /* 重新打开文件 */
    fp = fopen("test.txt", "r");

    /* 读取数据 */
    fgets(buffer, 80, fp);

    /* 输出数据 */
    printf("%s\n", buffer);

    /* 关闭文件 */
    fclose(fp);

    return 0;
}

该代码可以将字符串"Hello, World!"写入test.txt文件,并读取该文件中的内容输出。


📑 7. 文件操作性能优化

在进行文件操作时,需要注意文件读写速度的性能优化。可以使用缓冲机制来提高文件操作速度。使用setvbuf函数进行文件缓存操作。setvbuf函数的原型如下:

int setvbuf(FILE *stream, char *buf, int mode, size_t size);

stream参数表示要进行缓存操作的文件指针,buf参数表示缓存区地址,可以使用NULL表示由系统自动分配缓存区,mode参数表示缓存操作方式,有以下几种:

  • _IOFBF:全缓冲,即数据存满缓存区才进行I/O操作
  • _IOLBF:行缓冲,即遇到换行符才进行I/O操作
  • _IONBF:不带缓冲,即数据立即进行I/O操作

size参数表示缓存区大小,可以使用默认值BUFSIZ


📑 8. 文件操作常见问题解决方案

在进行文件操作时,可能会出现一些常见的问题,如文件打开失败文件读写失败等。可以使用perror函数来处理这些问题。perror函数的原型如下:

void perror(const char *s);

s参数表示在显示错误信息前显示的字符串,一般为程序名。


⚠️ 注意事项

  • 在使用文件之前,必须先打开文件

  • 操作文件之前,需确保文件的存在性

  • 检查文件是否打开成功。

  • 操作完成后,需关闭文件指针。

  • 对于涉及到数据的操作,务必小心谨慎,避免破坏文件的完整性

  • 防止程序中出现内存泄漏未处理的异常情况。

  • 建议在打开文件时使用二进制模式,以免在不同平台上出现文件格式的差异

  • 建议使用文件流操作,可以提高文件读写效率

  • 为了避免文件打开失败或者数据操作错误,应该经常检查错误信息,及时解决错误。

  • 对于文件的位置操作,应该掌握文件指针的相关知识。

  • 操作文件时应该考虑到文件操作的并发性问题,避免多个线程进程同时进行文件操作,引起数据的竞争和冲突

  • 操作文件时应具备完整的文件路径和文件名,以防止误删或误操作。


上一篇:字符串和字符处理


🎀小结

C语言中的文件操作包括了打开文件关闭文件读写文件文件指针位置文件错误处理文件属性操作文件目录操作等。在进行文件操作时需要注意性能优化常见问题解决方案。

🔚以上就是C语言文件操作的全部知识了~

🤗感谢大家的阅读~

📬后续还会继续更新💓,欢迎持续关注哟~📌

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨


在这里插入图片描述


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

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

相关文章

域内密码凭证获取

Volume Shadow Copy 活动目录数据库 ntds.dit&#xff1a;活动目录数据库&#xff0c;包括有关域用户、组和成员身份的 信息。它还包括域中所有用户的哈希值。 ntds.dit文件位置&#xff1a;%SystemRoot%\NTDS\NTDS.dit system文件位置&#xff1a;%SystemRoot%\System32\c…

好程序员:前端JavaScript全解析——Canvas绘制形状(下)

接着上一篇&#xff0c;好程序员继续讲解前端技术文章&#xff01; 绘制椭圆 ●canvas 也提供了绘制椭圆的 API ●语法 : 工具箱.ellipse( x, y, radiusX, radiusY, rotation, startAngle, endAngle, antiClockwise ) ○x : 椭圆中心点的 x 轴坐标 ○y : 椭圆中心点的 y 轴坐标…

Maven详解

一、什么是Maven Maven 是⼀个项⽬构建⼯具&#xff0c;创建的项⽬只要遵循 Maven 规范&#xff08;称为Maven项目&#xff09;&#xff0c;即可使用Maven 来进行&#xff1a;管理 jar 包、编译项目&#xff0c;打包项目等功能。 为什么学习 Servlet 之前要学 Maven&#xff1…

SAM(2023)-分割万物

文章目录 摘要算法数据引擎实验7.1 零样本单点生成mask7.2 零样本边缘检测7.3. 零样本目标Proposals7.4. 零样本实例分割7.5. 零样本文本生成Mask7.6. 消融实验 讨论限制&#xff1a;结论&#xff1a; 论文: 《Segment Anything》 github: https://github.com/facebookresear…

java获取类结构信息

package com.hspedu.reflection;import org.junit.jupiter.api.Test;import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** author 韩顺平* version 1.0* 演示如何通过反射获…

初级算法-回溯算法

主要记录算法和数据结构学习笔记&#xff0c;新的一年更上一层楼&#xff01; 初级算法-回溯算法 一、组合二、电话号码的字母组合三、组合总和四、组合Ⅱ五、组合Ⅲ六、分割回文串七、复原IP地址八、子集问题九、子集Ⅱ十、递增子序列十一、重新安排行程十二、全排列十三、全…

CASAIM自动化精密尺寸测量设备全尺寸检测铸件自动化检测铸件

铸造作为现代装备制造工业的基础共性技术之一&#xff0c;铸件产品既是工业制造产品&#xff0c;也是大型机械的重要组成部分&#xff0c;被广泛运用在航空航天、工业船舶、机械电子和交通运输等行业。 铸件形状复杂&#xff0c;一般的三坐标或者卡尺圆规等工具难以获取多特征…

【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序

文章目录 ✔️前言直接插入排序希尔排序选择排序1. 选择排序基础2. 选择排序优化3. 复杂度的分析 堆排序【⭐重点掌握⭐】1. 对堆的认识和数组建堆2. 对数组进行堆排序操作3. 复杂度的分析 冒泡排序快速排序【⭐重点掌握⭐】1. 霍尔法2. 挖坑法3. 前后指针法4. 快速排序优化&am…

每日一个小技巧:1招教你提取伴奏怎么做

伴奏是指在演唱或演奏时&#xff0c;用来衬托或补充主唱或乐器的音乐声音。而伴奏提取是一种技术&#xff0c;它可以帮助我们从歌曲中将人声和乐器分离出来。当我们听到一些喜欢的歌曲时&#xff0c;往往会被它的旋律深深吸引&#xff0c;想要将其作为自己的演唱曲目&#xff0…

国考只考一门?免试入学还好毕业的在职研究生专业有哪些

读同等学力申硕的同学想要拿学位证&#xff0c;那么首先要过的坎就是国考。修满学分和通过校考一般都不会很难&#xff0c;只要按时上课、根据院校安排的课程复习即可。而国考是全国统一命题、考试&#xff0c;大部分专业要考2门&#xff0c;对于有的同学来说&#xff0c;备考压…

从零开始学Python第13课:常用数据结构之字典

迄今为止&#xff0c;我们已经为大家介绍了Python中的三种容器型数据类型&#xff0c;但是这些数据类型仍然不足以帮助我们解决所有的问题。例如&#xff0c;我们需要一个变量来保存一个人的信息&#xff0c;其中包含了这个人的姓名、年龄、身高、体重、家庭住址、本人手机号、…

Springboot 自定义缓存配置 CacheManager 及redis集成

目录 前言 集成 maven依赖 CacheManagerConfig配置 redis配置 使用 Springboot 集成使用缓存 Cacheable CacheEvict 前言 现有项目中经常遇到的缓存集成问题&#xff0c;Springboot提供了统一的接口抽象与缓存管理器&#xff0c;可集成多种缓存类型&#xff0c;如 Co…

Java阶段二Day10

Java阶段二Day10 文章目录 Java阶段二Day10DQLGROUP BY 分组按单字段分组例 按多字段分组例 按照聚合函数的结果排序例 HAVING子句问题错误原因HAVING子句的应用HAVING和WHERE的区别例 子查询 (SubQuery)概念应用场景子查询分类在DQL中使用子查询单行单列子查询例 多行单列子查…

hook函数

什么是hook函数 在计算机编程中&#xff0c;hook函数是指在特定的事件发生时被调用的函数&#xff0c;用于在事件发生前或后进行一些特定的操作。通常&#xff0c;hook函数作为回调函数被注册到事件处理器中&#xff0c;当事件发生时&#xff0c;事件处理器会自动调用相应的ho…

QtDAY 2

代码&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QString> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : …

【Hello Network】网络编程套接字(二)

作者&#xff1a;小萌新 专栏&#xff1a;网络 作者简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客简介&#xff1a;简单介绍网络的基础概念 网络编程套接字&#xff08;二&#xff09; 简单的TCP网络程序服务端创建套接字服务端绑定服务器监听服务端获取连接服务端处…

Qt Quick Qml-Rectangle案例

Qt Quick - Qml 1.Rectangle //组件 IShadow.qml import QtQuick import QtQuick.ControlsItem {id:rootanchors.fill: parentanchors.margins: -4property color color: "#999999"property int radius: 4Rectangle{width: root.widthheight: root.heightanchors.ce…

原型图都可以用什么软件做?分享这9款给你

设计师在进行原型设计师时&#xff0c;会使用原型图软件&#xff0c;从产生想法到向开发人员提交项目。无论是构建基本线框还是功能齐全的原型&#xff0c;原型图软件都可以为你节省大量的时间和精力。 如果你是这个领域的新手或者想更新你的原型图软件包&#xff0c;请快速看…

iOS App的生命周期

App的生命周期 App从启动到退出的过程中&#xff0c;iOS应用程序不断从系统接收各种事件&#xff0c;如&#xff1a;用户点击了屏幕、用户点击了Home键&#xff0c;并对这些事件进行响应。接受事件是UIApplication对象的工作&#xff0c;但是&#xff0c;响应事件就需要由程序…

Dubbo详解

一、基础知识 1、 RPC RPC【Remote Procedure Call】是指远程过程调用&#xff0c;是一种进程间通信方式&#xff0c;他是一种技术的思想&#xff0c;而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数&#xff0c; 而不用程序员显式编码…