C语言 文件操作

文章目录

  • 前言
  • 文件概念
    • 文件名
    • 数据文件&程序文件
    • 文本文件&二进制文件
    • 文件缓冲区
  • 文件操作
    • FILE结构体
    • 文件指针
    • 文件打开&关闭
    • 文件输入/输出
    • 文件指针控制

前言

主要需要看的是概念部分、以及FILE结构体、文件指针部分。其余函数使用,知道其功能存在即可,实际在使用到这些函数时去官方文档查的话,不管是介绍还是示例都更齐全。

文件概念

文件名

完整文件名包含三部分:文件路径+文件名主干+文件后缀

c:\md\test.txt

文件名在同一台主机中是唯一的。

数据文件&程序文件

根据用途划分:

  1. 程序文件
    程序文件是包含计算机程序代码的文件,它包含了一系列指令和命令,用于告诉计算机如何执行特定的任务。程序文件通常以可执行文件(如.exe、.app等)或源代码文件(如.c、.py等)的形式存在。它们可以被计算机加载和执行,从而实现特定的功能或任务。

  2. 数据文件
    数据文件是存储实际数据的文件,它包含了计算机程序需要处理的信息。数据文件可以是文本文件(如.txt、.csv等)或二进制文件(如.jpg、.mp3等),其中包含了具体的数据内容。数据文件可以包含文本、数字、图像、音频、视频等各种类型的数据,这些数据可以被程序文件读取和处理。

文本文件&二进制文件

根据数据储存形式划分

  1. 内存中文件是二进制文件
  2. 文本文件以ASCII字符形式存储
  3. 二进制文件以二进制形式存储

文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。 文件缓冲区存在的意义是同过减少IO次数提高文件操作整体的效率。
在这里插入图片描述

文件操作

FILE结构体

FILE 结构体的定义:

struct _iobuf {char *_ptr; // 文件指针int   _cnt;char *_base;int   _flag;int   _file;int   _charbuf;int   _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE

当使用者打开一个文件的时候,OS就会自动创建该文件的FILE类型变量,通过FILE的定义,可以理解该FILE类型记录了该文件的信息,故用户可以使用FILE类型变量的指针对FILE变量进行操作,从而达到对打开的文件进行操作的目的。例:

FILE* fp =  fopen ( const char * filename, const char * mode ); // 后续用fp指针操作即可

文件指针

文件指针是FILE结构体中的一个属性
文件指针在读取一个字符后会向后移动一位,说明文件指针是可以指向文件信息区的各个部分的,可受使用者通过函数调整位置从而进行不同读取/写入策略的。(和数组的指针相比逻辑差不多,操作方法不一样)

在这里插入图片描述

文件打开&关闭

文件打开后必须关闭,否则会造成系统资源浪费。

//打开文件函数
FILE * fopen ( const char * filename, const char * mode );
//关闭文件函数
int fclose ( FILE * stream )

FILE * fopen ( const char * filename, const char * mode ) mode参数 模式 :

“r”  (只读) 为了输入数据,打开一个已经存在的文本文件
“w”  (只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”  (追加) 向文本文件尾添加数据 建立一个新的文件
“rb” (只读) 为了输入数据,打开一个二进制文件 出错
“wb” (只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab” (追加) 向一个二进制文件尾添加数据 出错
“r+” (读写) 为了读和写,打开一个文本文件 出错
“w+” (读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+” (读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

文件输入/输出

字符输入函数    fgetc   所有输入流
字符输出函数    fputc   所有输出流
文本行输入函数  fgets   所有输入流
文本行输出函数  fputs   所有输出流
格式化输入函数  fscanf  所有输入流
格式化输出函数  fprintf 所有输出流
二进制输入      fread   文件
二进制输出      fwrite  文件`

例:

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");  // 打开文件if (file == NULL) {printf("无法打开文件\n");return 1;}int ch;while ((ch = fgetc(file)) != EOF) {  // 逐个字符读取文件内容printf("%c", ch);}fclose(file);  // 关闭文件return 0;
}

文件指针控制

(文件随机读写)

fseek

功能:根据文件指针的位置和偏移量来定位文件指针。
函数原型为:

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

参数说明:
stream:指定要设置位置的文件指针。
offset:设置的偏移量,即要移动的字节数。
origin:设置基准位置,可以取以下值:
SEEK_SET:从文件开头开始计算偏移量。
SEEK_CUR:从当前位置开始计算偏移量。
SEEK_END:从文件末尾开始计算偏移量。
返回值:
如果成功设置文件指针的位置,则返回0;
如果发生错误,则返回非零值。
使用示例:

#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");  // 打开文件if (file == NULL) {printf("无法打开文件\n");return 1;}fseek(file, 5, SEEK_SET);  // 设置文件指针位置为从文件开头偏移5个字节int ch;while ((ch = fgetc(file)) != EOF) {  // 从当前位置开始读取文件内容printf("%c", ch);}fclose(file);  // 关闭文件return 0;
}

ftell
**功能:**返回文件指针相对于起始位置的偏移量

long int ftell(FILE *stream);

参数说明:
stream:指定要获取位置的文件指针。
返回值:
如果成功获取文件指针的当前位置,则返回当前位置相对于文件开头的偏移量(以字节为单位);
如果发生错误,则返回-1。

rewind
功能:
让文件指针的位置回到文件的起始位置
函数原型为

void rewind(FILE *stream);

参数说明
stream:指定要重新设置位置的文件指针。
返回值:无。

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

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

相关文章

【SpringBoot】请求参数

1. BS 架构 BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 在SpringBoot进行web程序开发时&#xff0c;它内置了一个核心的Servlet程序 DispatcherServlet&#xff0c;称之为 核…

EasyExcel之文件导出最佳实践

文件导出 官方文档&#xff1a;写Excel | Easy Excel (alibaba.com) 引言 当使用 EasyExcel 进行 Excel 文件导出时&#xff0c;我最近在工作中遇到了一个需求。因此&#xff0c;我决定写这篇文章来分享我的经验和解决方案。如果你对这个话题感兴趣&#xff0c;那么我希望这篇…

c语言插入排序算法(详解)

插入排序是一种简单直观的排序算法&#xff0c;其主要思想是将一个待排序的元素插入到已经排好序的部分的合适位置。 插入排序的原理如下&#xff1a; 将序列分为两部分&#xff1a;已排序部分和未排序部分。初始时&#xff0c;已排序部分只包含第一个元素&#xff0c;未排序…

php 接入 百度编辑器

按照github上的操作下载百度编辑器的包后&#xff0c;根据文档上的步骤操作&#xff08;可能会遇到报错&#xff09;&#xff1a; 1、git clone 仓库 2、npm install 安装依赖&#xff08;如果没有安装 grunt , 请先在全局安装 grunt&#xff09; 我的是报了下面的错&#…

Leetcode 17 电话号码的字母组合

理解题意&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合 本质上&#xff1a;数字代表着一个字母集合 数字的个数决定了递归的深度&#xff0c;即树的深度 数字代表的字母组合决定了当前树的宽度。 1.暴力回溯 这里没有什么剪枝…

387.字符串中的第一个唯一字符 —> `size()`

解答&#xff1a; int firstUniqChar(string s) {int size s.size();// char count[26] { 0 };// error.1int count[26] { 0 };// for (int i 0; i < s.size() - 1; i) // error.2for (int i 0; i < size; i){count[s[i] - a] 1;}for (int i 0; i < size; i){…

Android 幸运转盘实现逻辑

一、前言 幸运转盘在很多app中都有&#xff0c;也有很多现实的例子&#xff0c;不过这个难度并不是如何让转盘转起来&#xff0c;真正的难度是如何统一个方向转动&#xff0c;且转到指定的目标区域&#xff08;中奖概率从来不是随机的&#xff09;&#xff0c;当然还不能太假&…

人类的耳朵:听觉的动态范围

作者&#xff1a;听觉健康 听觉的动态范围即可用的听力范围。在坐标系中&#xff0c;它可以表示为以听阈和最大舒适级为界形成的区域&#xff0c;其坐标轴分别为频率和声压级&#xff08;刺激持续时间在某种程度上对其产生影响&#xff09;。是什么因素决定了人类听力的极限&am…

Compilation failureFailure executing javac, but could not parse the error

记一次maven编译错误导致的打包失败问题。错误如下 Compilation failure Failure executing javac, but could not parse the error: javac: Ч ı :  ? : javac <options> <source files> -help г ܵ ѡ 排查路径如下&#xff1a; 1&#xff…

【MySQL】MySQL的varchar字段最大长度是65535?

在MySQL建表sql里,我们经常会有定义字符串类型的需求。 CREATE TABLE `user` ( `name` varchar(100) NOT NULL DEFAULT COMMENT 名字) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ; 比方说user表里的名字,就是个字符串。MySQL里有两个类型比较适合这个场景。 char和varchar。…

我尝试用 AI 来做数据分析,结果差强人意!

大家好&#xff0c;我是木川 工作中经常会需要分析数据 1、统计分析&#xff0c;计算某项指标的均值、分位数、标准差等 2、相关性分析&#xff0c;比如分析销售额与顾客年龄、顾客性别、促销活动等的相关性 3、可视化分析&#xff0c;比如绘制柱状图、折线图、散点图等 有了 A…

几种排序的实现

直接插入排序 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 实际中我们玩扑克牌时&#xff…

交付《啤酒游戏经营决策沙盘》的项目

感谢首富客户连续两年的邀请&#xff0c;交付《啤酒游戏经营决策沙盘》的项目&#xff0c;下周一JSTO首席学习官Luna想让我分享下系统思考与投资理财&#xff0c;想到曾经看过的一本书《深度思维》&#xff0c;看到一些结构来预判未来。不仅仅可以应用在企业经营和组织发展上&a…

Uncaught SyntaxError: Unexpected end of input (at manage.html:1:21) 的一个解

关于Uncaught SyntaxError: Unexpected end of input (at manage.html:1:21)的一个解 问题复现 <button onclick"deleteItem(${order.id},hire,"Orders")" >delete</button>报错 原因 函数参数的双引号和外面的双引号混淆了&#xff0c;改成…

【vuex】

vuex 1 理解vuex1.1 vuex是什么1.2 什么时候使用vuex1.3 vuex工作原理图1.4 搭建vuex环境1.5 求和案例1.5.1 vue方式1.5.2 vuex方式 2 vuex核心概念和API2.1 getters配置项2.2 四个map方法的使用2.2.1 mapState方法2.2.2 mapGetters方法2.2.3 mapActions方法2.2.4 mapMutations…

“HALCON error #2454:HALCON handle was already cleared in operator set_draw“

分析&#xff1a;错误提示是窗口句柄已经被删除&#xff0c;这是因为前边的一句 HOperatorSet.CloseWindow(hWindowControl1.HalconWindow); 关掉了窗口&#xff0c;屏蔽或删除即可。

UDS诊断 10服务的肯定响应码后面跟着一串数据的含义,以及诊断报文格式定义介绍

一、首先看一下10服务的请求报文和肯定响应报文格式 a.诊断仪发送的请求报文格式 b.ECU回复的肯定响应报文格式 c.肯定响应报文中参数定义 二、例程数据解析 a.例程数据 0.000000 1 725 Tx d 8 02 10 03 00 00 00 00 00 0.000806 1 7A5 Rx d 8 06 50 03 00 32 01 F4 CC …

Brushed DC mtr--PIC

PIC use brushed DC mtr fundmental. Low-Cost Bidirectional Brushed DC Motor Control Using the PIC16F684 DC mtr & encoder

《opencv实用探索·八》图像模糊之均值滤波、高斯滤波的简单理解

1、前言 什么是噪声&#xff1f; 该像素与周围像素的差别非常大&#xff0c;导致从视觉上就能看出该像素无法与周围像素组成可识别的图像信息&#xff0c;降低了整个图像的质量。这种“格格不入”的像素就被称为图像的噪声。如果图像中的噪声都是随机的纯黑像素或者纯白像素&am…

TailwindCSS 如何设置 placeholder 的样式

前言 placeholder 在前端多用于 input、textarea 等任何输入或者文本区域的标签&#xff0c;它用户在用户输入内容之前显示一些提示。浏览器自带的 placeholder 样式可能不符合设计规范&#xff0c;此时就需要通过 css 进行样式美化。 当项目中使用 TailwindCSS 处理样式时&a…