当前位置: 首页 > news >正文

c语言:文件操作(1)

前言:为什么要使用文件

使用文件可以让程序在不同运行之间保存和读取数据。这样可以实现持久化存储,即使程序关闭后数据也不会丢失。文件也可以用于数据交换,允许不同程序之间共享信息。在 C 语言中,文件还可以用于读取配置信息,日志记录等。当你玩电脑游戏时,游戏通常会让你保存进度。这就好比把游戏状态保存到一个文件中,这样你可以在之后重新加载游戏而不会丢失进度。另外,想象一下你在做一份报告,你可以把报告内容保存到文件中,这样即使你关掉电脑,文件中的内容也会被保存下来,以便你之后再次打开并继续编辑。文件就像是一个存储盒,可以把数据放进去,然后在需要的时候再取出来使用。总的来说,文件在编程中是非常重要的,可以帮助程序处理数据和信息。


文件的定义

文件是计算机存储数据的一种方式,可以存储文本、图像、音频、视频等各种类型的信息。在计算机中,文件通常被组织成一个由字节组成的序列,每个文件都有一个唯一的名称用于标识。文件可以存储在计算机的硬盘、固态硬盘、光盘、U盘等存储介质上。


分类:

从文件功能的角度分为两类:程序文件,数据文件。

程序文件:

程序文件是计算机中用来存储软件程序代码的文件。程序文件可以包含各种编程语言编写的指令和数据,用于告诉计算机如何执行特定的任务或操作。

程序文件通常也具有特定的文件扩展名或后缀,以便操作系统和用户能够识别它们并正确地处理。这些后缀通常指示了程序文件的类型或格式。例如:

  • 可执行程序文件通常以.exe、.app、.bat等结尾。
  • 脚本文件通常以.sh、.py、.js等结尾。
  • 动态链接库文件通常以.dll、.so等结尾。
  • Java程序文件通常以.jar、.class等结尾。
  • HTML网页文件通常以.html、.htm结尾。

数据文件:

数据文件是计算机中用来存储各种类型数据的文件。这些数据可以是文本、图像、音频、视频、数据库记录等。数据文件通常以特定的格式存储,以便计算机能够正确地读取和解释其中的信息。这些文件可以通过各种应用程序进行创建、编辑和访问,以便用户能够查看、修改和管理其中的数据。

数据文件通常具有特定的文件扩展名或后缀,以便操作系统和应用程序能够识别它们并正确地处理。这些后缀通常指示了数据文件的类型或格式。例如:

  • 文本文件通常以.txt、.doc、.pdf等结尾。
  • 图像文件通常以.jpg、.png、.gif等结尾。
  • 音频文件通常以.mp3、.wav、.flac等结尾。
  • 视频文件通常以.mp4、.avi、.mov等结尾。
  • 数据库文件通常以.db、.mdb、.sql等结尾。

    文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀。
例如:

假设你有一个名为"mydocument.docx"的文件,它存储在Windows操作系统的C盘的Documents文件夹中。在这种情况下,文件名的各部分如下:

  • 文件路径:C:\Documents\
  • 文件名主干:mydocument
  • 文件后缀:.docx
C:\Documents\mydocument.docx

二进制文件和文本文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

二进制文件:数组在内存中以二进制的形式存储,不加转换的输出到外存。

文本文件:以ASCLL字符的形式存储的文件。

17acc0db3ae34e32934b5b1cfe2cf801.webp

示例:

#include<stdio.h>
int main()
{// 定义一个整型变量a,赋值为10000int a = 10000;// 打开一个名为test.txt的文件,以二进制写入模式打开FILE* pf = fopen("test.txt", "wb");// 将变量a的内容以二进制形式写入到文件中fwrite(&a, 4, 1, pf);// 关闭文件fclose(pf);// 将文件指针置为空pf = NULL;// 返回0,表示程序正常结束return 0;
}

 这段代码的功能是将整数变量a的值10000以二进制形式写入到名为test.txt的文件中。具体来说,它通过fopen函数以二进制写入模式打开文件,然后使用fwrite函数将整数a的二进制表示写入到文件中,最后使用fclose关闭文件。

效果演示:

1.运行完程序后,返回解决方案资源管理器。

找到源文件,添加,现有项

bfa98cd8a5fe4551bea93fa3fb5af4d6.png

2.点开, 找到test文件,双击test文件。

692e3b2433274dc9848e77b9db266107.png

3,回到解决方案中, 此时,已经出现了test.txt文件,右键此文件,找到打开方式,选择二进制编译器,确定

bd4ac9dc84cd490f8be3c1cc1ed0a3d7.png

4.得到结果,观察二进制文件。

efee68c14076460eb548787dd5ef10e1.png 

 流和标准流

在C语言中,流(stream)是一个用于输入和输出的抽象概念。它提供了一种统一的方式来处理不同类型的输入和输出,包括文件、键盘、屏幕和其他设备。

你可以把它想象成水流。就像水流可以从一个地方流向另一个地方一样,流在计算机编程中也是用于数据的流动。

标准流

C语言中有三个标准流:

  1. 标准输入流(stdin): 用于从键盘或其他输入设备读取数据。在C语言中,scanf函数就是从标准输入流中读取数据的一个例子。
  2. 标准输出流(stdout): 用于向屏幕或其他输出设备输出数据。在C语言中,printf函数就是向标准输出流输出数据的一个例子。
  3. 标准错误流(stderr): 用于向屏幕或其他输出设备输出错误信息。在C语言中,fprintf函数可以向标准错误流输出数据。

stdin、stdout、stderr三个流的类型是:FILE*,通常称为文件指针。

C语言中,就是通过FILE*的文件指针来维护流的各种操作的。

文件指针

文件指针是C语言中用于处理文件的重要概念。它是一个指向FILE类型的指针,FILE类型是C语言标准库中用于表示文件的结构体类型。

例如:VS2022编译器环境下提供的stdio.h头文件中,有以下的文件类型声明:

typedef struct 
{int _Placeholder;
} fpos_t;typedef struct 
{unsigned int _Mode;
} _fmode_t;typedef struct 
{long long _Placeholder;
} fpos64_t;typedef struct _iobuf 
{char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;
} FILE;typedef struct _wfinddata_t 
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;_fsize_t size;wchar_t name[260];
} _wfinddata_t;typedef struct _wfinddatai64_t 
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;__int64 size;wchar_t name[260];
} _wfinddatai64_t;typedef struct _wfinddata32_t 
{unsigned attrib;time_t time_create;time_t time_access;time_t time_write;unsigned long size;wchar_t name[260];
} _wfinddata32_t;typedef struct _wfinddata32i64_t 
{unsigned attrib;__time64_t time_create;__time64_t time_access;__time64_t time_write;unsigned __int64 size;wchar_t name[260];
} _wfinddata32i64_t;

文件的关闭和打开:

打开文件

要使用文件指针,首先需要打开文件。可以使用fopen函数来打开文件,该函数会返回一个指向FILE类型的指针,表示打开的文件。fopen函数的原型如下:

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

其中,filename是要打开的文件名,mode表示文件的打开模式,比如读取、写入、追加等。

 文件指针的位置

文件指针指示了文件中当前的位置,它可以在文件中移动,以便进行读取或写入操作。可以使用fseek函数来移动文件指针的位置:

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

其中,stream是文件指针,offset是偏移量,origin表示起始位置,可以是SEEK_SET(文件开头)、SEEK_CUR(当前位置)或SEEK_END(文件末尾)。 

读写文件 

一旦文件被打开,就可以使用文件指针进行读取和写入操作。比如,可以使用fscanffprintf函数进行格式化的输入和输出,或者使用freadfwrite函数进行二进制数据的读写操作。 

关闭文件

在文件操作完成后,应该使用fclose函数关闭文件,释放文件资源:

int fclose(FILE *stream);

示例

下面是一个示例,演示了如何使用文件指针来打开文件、写入数据并关闭文件:

#include <stdio.h>int main() 
{FILE *fp;fp = fopen("example.txt", "w");  // 以写入模式打开文件if (fp != NULL) {fprintf(fp, "This is a file created using file pointers!");  // 写入数据fclose(fp);  // 关闭文件}return 0;
}

8053b2c0ffae4bcbbb6ad05f299911e5.png 

下一章节,讲文件的读写顺序,等各种顺序读写函数。

 

相关文章:

c语言:文件操作(1)

前言&#xff1a;为什么要使用文件 使用文件可以让程序在不同运行之间保存和读取数据。这样可以实现持久化存储&#xff0c;即使程序关闭后数据也不会丢失。文件也可以用于数据交换&#xff0c;允许不同程序之间共享信息。在 C 语言中&#xff0c;文件还可以用于读取配置信息&…...

运筹学经典问题(三):最大流问题

问题描述 给定一个图网络 G ( V , E ) G(V, E) G(V,E)&#xff0c;网络中连边的权重代表最大容量&#xff0c;在这个图中找出从起点到终点流量最大的路径。 数学建模 集合&#xff1a; I I I&#xff1a;点的集合&#xff1b; E E E&#xff1a;边的集合。 常量&#x…...

裸机开发与Linux驱动开发的区别

一. 简介 裸机开发&#xff0c;即我们常说的不带系统的单片机开发。 Linux驱动开发&#xff0c;即带文件系统的Linux驱动的开发。 二. 裸机开发与Linux驱动开发的区别 1. 裸机开发 比较底层&#xff0c;跟寄存器打交道&#xff0c;有些 MCU提供了库。 2. Linux驱动开发…...

【蓝桥杯选拔赛真题75】Scratch行走的螃蟹 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 scratch行走的螃蟹 一、题目要求 编程实现 二、案例分析 1、角色分析...

小型洗衣机哪个牌子质量好?迷你洗衣机排名前十名

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…...

MySQL_9.B-数索引

1.定义&#xff1a;B-树是一类树,包括B-树、B树、B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点. 2.B-数产生的原因 当数据量非常大时&#xff0c;内存不够用&#xff0c;大部分数据只能存放在磁盘上&#xff0c;只有需要的…...

ubuntu-更改镜像源-系统初始化-安装Clion-C++编译环境-Java安装

文章目录 1.镜像配置文件及更新2.安装java sdk并配置环境变量3.安装Clion4.总结 1.镜像配置文件及更新 将sources.list备份保存为sources.list.backup,以防止有需要的时候更换回来。 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup sudo gedit /etc/apt/source…...

c语言-动态内存管理

文章目录 一、为什么会有动态内存管理二、申请内存函数1、malloc2、free3、calloc4、realloc 三、常见的动态内存的错误四、练习 一、为什么会有动态内存管理 1.我们一般的开辟空间方式&#xff1a; int a 0;//申请4个字节空间 int arr[10] { 0 };//申请40个字节空间2.这样…...

【JAVA杂货铺】一文带你走进面向对象编程的构造方法 | Java| 面向对象编程 | (中)

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:Java学习系列专栏&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 回顾 构造方法 this关键字 面试题 构造方法的类型 下节预告 代码块 &#x1f352;回顾 之前我们学习了什么是类 什么是…...

动态规划学习——通符串匹配,正则表达式

目录 ​编辑 一&#xff0c;通符串匹配 1.题目 2.题目接口 3&#xff0c;解题思路及其代码 二&#xff0c;正则表达 1.题目 2.题目接口 3.解题思路及其代码 三&#xff0c;交错字符串 1.题目 2&#xff0c;题目接口 3.解题思路及其代码 一&#xff0c;通符串匹配 1…...

【数据开发】Hive 多表join中的条件过滤与指定分区

1、条件过滤 left join 中 on 后面加条件 where 和 and 的区别 1、 on条件是在生成临时表时使用的条件&#xff0c;它不管and中的条件是否为真&#xff0c;都会保留左边表中的全部记录。2、where条件是在临时表生成好后&#xff0c;再对临时表进行过滤的条件。这时已经没有le…...

基于Java SSM框架实现高校人事管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现高校人事管理系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用户的需…...

[C++] 模板进阶(非类型模板参数,特化,分离编译)

文章目录 1、非类型模板参数2、模板的特化2.1 什么是模板特化2.2 函数模板特化2.3 类模板的实例化2.3.1 全特化2.3.2 偏特化 3、模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4、模板总结 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即…...

C++ this指针

通常情况下&#xff0c;类的成员函数都只涉及一个对象&#xff0c;即调用它的对象。但有时候方法可能涉及到两个对象&#xff0c;在这种情况就需要使用到C的this指针。 class Stock { private: ... double total_val; ... public: double total() const {return total_val;} }…...

解决Sortable拖动el-table表头时,由于选择列造成的拖拽顺序错乱的bug

原因 由于我的表头是由数组循环遍历生成的&#xff0c;而选择列不在数组内&#xff0c;只能在循环外定义el-table-column&#xff0c;造成拖动时索引错乱错误代码 <el-tableheader-dragend"headerDragend"id"out-table":data"state.sliceTable&quo…...

Plantuml之类图语法介绍(十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

深入Docker命令行:探索常用命令和实用技巧

Docker命令行界面是每个容器开发者的得力工具。在这篇文章中&#xff0c;将深入探讨一系列常用的Docker命令&#xff0c;以及一些实用技巧&#xff0c;通过更丰富的示例代码&#xff0c;帮助大家更全面地理解和运用Docker命令行工具。 1. Docker基本命令 1.1 镜像操作 深入了…...

qt 容器QVector,QMap,QHash的常见使用与该迭代器的简单介绍

一. QVector容器是一个动态数组&#xff0c;可以容纳任意数量的元素,在相邻的内存中存储给定的数据类型作为一组数据,在QVector前部或中间位置插入元素都会导致内存中大量的数据元素移动,这使得操作速度会减慢.可使用迭代器对这组数据进行访问. 和其他的容器类型类似,QVector…...

两线制无源 4-20mA 回路供电隔离变送器

两线制无源 4-20mA 回路供电隔离变送器 一入一出两线制无源 4-20mA 回路供电隔离变送器 概述&#xff1a;JSD TAW-1001D-100L-F 系列隔离变送器是 4-20mA 两线制回路供电的电流隔离变送配电器,该隔离变送器采用电磁隔离技术,并通过输入端馈电方式,给输入端两线制仪器仪表设备供…...

强化学习优质博客记录(随缘更新)

杂记 速成深度强化学习的人可能陷入的几个误区(2023-03更新) DQN DQN表现稳定提升和收敛的技巧集锦 TRPO 如何看懂TRPO里所有的数学推导细节? PPO The 37 Implementation Details of Proximal Policy Optimization强化学习算法中&#xff0c;PPO算法是不是就是加了重要…...

RabbitMQ-hello

0. pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…...

案例044:基于微信小程序的消防隐患在线举报系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

MES系统需要具备哪些性能方面的需求?

MES系统需要具备哪些“性能需求”&#xff1f;关于这个问题&#xff0c;我觉得有必要先和大家解释一下&#xff0c;到底什么是性能需求&#xff1f;性能需求在MES系统的作用是什么&#xff1f;讲明白了这2点&#xff0c;问题自然而然就解决了。 什么是性能需求&#xff1f; 通…...

数据在内存中的存储(整型篇)

1.辨析原码反码补码&#xff1a; 1.原码&#xff1a;有32位&#xff08;int类四个字节&#xff0c;一个字节八个比特位&#xff09;&#xff0c;第一位是符号位&#xff0c;0正1负&#xff0c;其余为二进制位。 2.计算一般是对原码进行计算&#xff0c;但在负数计算使用原码会导…...

大一作业习题

第一题&#xff1a;答案&#xff1a; #include <stdio.h> void sort(int a[], int m) //将数组a的前m个元素(从小到大)排序 {int i 0;for (i 0; i < m - 1; i){int j 0;int flag 1;for (j 0; j < m - 1 - i; j){if (a[j] > a[j 1]){int t 0;t a[j];…...

Python大模型TensorFlow/PyTorch/Scikit-learn/Keras/OpenCV/Gensim

Python 作为一种高级编程语言&#xff0c;可以用于开发各种大小的模型。以下是一些常见的 Python 大模型&#xff0c;以及它们的优势、劣势和使用场景&#xff1a; TensorFlow&#xff1a; 优势&#xff1a;TensorFlow 是一个非常流行的深度学习库&#xff0c;具有高度的可扩…...

TCP 和 UDP 区别? 2、TCP/IP 协议涉及哪几层架构? 3、描述下 TCP 连接 4 次挥手的过程?为什么要 4 次挥手?

文章目录 1、TCP 和 UDP 区别&#xff1f;2、TCP/IP 协议涉及哪几层架构&#xff1f;3、描述下 TCP 连接 4 次挥手的过程&#xff1f;为什么要 4 次挥手&#xff1f;4、计算机插上电源操作系统做了什么&#xff1f;5、Linux 操作系统设备文件有哪些&#xff1f; 1、TCP 和 UDP …...

pyside/qt03——人机协同的编程教学—直接面向chatGPT实战开发(做中学,事上练)

先大概有个草图框架&#xff0c;一点点丰富 我纠结好久&#xff0c;直接用Python写UI代码 还是用designer做UI 再转Python呢&#xff0c; 因为不管怎么样都要转成Python代码&#xff0c; 想了想还是学一下designer吧&#xff0c;有个中介&#xff0c;有直观理解。 直接这样也可…...

swing快速入门(五)

注释很详细&#xff0c;直接上代码 上一篇 本篇新增内容&#xff1a; 1.布局管理器BorderLayout 2.自适应尺寸方法pack() import java.awt.*; public class swing_test_3 {public static void main(String[] args) {Frame framenew Frame("演示BorderLayout");//…...

银河麒麟v10系统SSH远程管理及切换root用户的操作方法

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一…...