C标准库 操作文件

数据持久化的两种方法:文件数据库

文本文件和二进制文件

举个例子,写C++的代码,源代码为文本文件、编译出来的可执行文件(.exe)文件是二进制文件

文本文件

以文本的编码(ASCII码、UNICODE编码等**)**形式存储在计算机中。它是以""为基本结构的一种信息组织和存储方式。

文本文件是基于字符编码的文件,基本上是定长的,译码容易些

二进制文件

文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。

二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)

二进制文件一般是可执行程序、图形、图像、声音等等。

C标准库操作文件的函数fopen(打开)fclose(关闭)

fopen()函数

FILE *fopen(cosnt char *path,const char * mode);​其中第一个参数为文件路径,第二个参数为打开模式

成功返回I/O流指针,作为后续I/O流函数的参数

失败返回NULL

打开模式

打开模式 作用 作用
r 只读 文件必须存在,从头开始读
w 只写 文件不存在就创建,文件存在就清空内容,从头开始写
a 追加 文件不存在就创建,文件存在就在文件尾开始写
r+ 读写 文件必须存在,从头开始读写
w+ 写读 文件不存在就创建,文件存在就清空内容,从头开始写读
a+ 追读 文件不存在就创建,文件存在就在文件尾开始写,从头开始读

fclose()函数

int fclose(FILE * fp)​ 参数为I/O流指针

成功返回0,失败返回EOF(End Of File)

操作文件的步骤

  1. 声明文件I/O流指针
  2. 打开文件
  3. 对文件的操作
  4. 关闭文件,I/O流指针置为NULL
#include <stdio.h>
int main(){

FILE *fp = NULL; //声明I/O流指针

fp = fopen("./1.txt","r"); //打开文件

//对文件的操作

………………

fclose(fp); //关闭文件

fp = NULL; // I/O流指针置为NULL

}

格式化I/O

格式化输出

int fprintf(
FILE* stream , //I/O流指针
const char * format, //格式化字符串
…… //输出数据
)

fprintf(fp,"%d",520)​; 输出到fp指代的文件中

#include <stdio.h>

int main(){

FILE *fp = NULL; //声明I/O流指针

fp = fopen("./test.txt","w+"); //打开文件,写读
fprintf(fp,&quot;%s %d&quot;,&quot;清光照归途&quot;,520);		//将&quot;清光照归途 520&quot;写入文件中

fclose(fp);		//关闭文件
fp = NULL; //I/O流指针置NULL return 0;

}

格式化输入

int fscanf(
FILE* stream , //I/O流指针
const char * format, //格式化字符串
…… //输出数据
)

fscanf(fp,"%d",&num)​; 把从文件中读取到的数据放入num中

#include <stdio.h>

int main(){

FILE *fp = NULL; //声明I/O流指针

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

fp = fopen("./test.txt","r"); //打开文件,读
//fprintf(fp,&quot;%s %d&quot;,&quot;清光照归途&quot;,520);		//将&quot;清光照归途 520&quot;写入文件中

char str[101];
int num ; //str和num用于存放从文件中读取的数据
fscanf(fp,&quot;%s %d&quot;,str,&amp;num);
printf(&quot;读取到的内容为:%s %d&quot;,str,num); fclose(fp); //关闭文件
fp = NULL; //I/O流指针置NULL return 0;

}

二进制I/O

二进制输入

size_t fwrite(const void* ptr , 	// 缓存区地址
size_t size, 				//元素字节数

size_t number, 			//期望输出的元素数

FILE* stream 			//I/O流指针

)

例如:int a[9] = {0,1,2,3,4,5,6,7,8};

fwrite(a,sizeof(int),9,fp);​将a数组写入至fp指向的文件中

#include <stdio.h>

int main(){

FILE *fp = NULL; //声明I/O流指针

fp = fopen("./bin.dat","w+"); //打开文件,写读
int a[9] = {0,1,2,3,4,5,6,7,8};
fwrite(a,sizeof(int),9,fp); //将a数组写入到fp指向的文件中 fclose(fp); //关闭文件
fp = NULL; //I/O流指针置NULL
return 0;

}

二进制输出

size_t fread(const void* ptr , 	// 缓存区地址
size_t size, 				//元素字节数

size_t number, 			//期望输出的元素数

FILE* stream 			//I/O流指针

)

fread(a,sizeof(int),9,fp);​从fp指向的文件中读取数据放入a中

#include <stdio.h>

int main(){

FILE *fp = NULL; //声明I/O流指针

//fp = fopen("./bin.dat","w+"); //打开文件,写读

fp = fopen("./bin.dat","r"); //打开文件,读
//int a[9] = {0,1,2,3,4,5,6,7,8};
int buffer[9]; //缓存区地址
fread(buffer,sizeof(int),9,fp); //将文件内容读取到buffer
for(int i = 0;i&lt;9;i++){
printf(&quot;%d &quot;,buffer[i]);
} fclose(fp); //关闭文件
fp = NULL; //I/O流指针置NULL
return 0;

}

文件读写位置

设置文件读写位置

int fseek(	FILE* stream,//I/O流指针
		long offset, //偏移字节数

		int whence, //偏移起点
(SEEK_SET文件头 ,SEEK_CUR当前位置,SEEK_END文件尾)

)

成功返回0,失败返回-1

例如:fseek(fp,8,SEEK_SET)​从fp文件头开始往后数8字节的位置开始

fseek(fp,-12,SEEK_END)​从fp文件尾开始往前数12字节的位置开始

获取文件操作位置

**long feel(FILE *stream)**参数为I/O流指针

成功返回当前文件位置,失败返回-1

#include <stdio.h>

int main(){

FILE *fp = NULL; //声明I/O流指针

//fp = fopen("./bin.dat","w+"); //打开文件,写读

fp = fopen("./bin.dat","r"); //打开文件,读
fseek(fp,8,SEEK_SET);
long lac1 = ftell(fp);
printf(&quot;初始文件位置:%ld\n&quot;,lac1); //int a[9] = {0,1,2,3,4,5,6,7,8};
int buffer[9] = {0}; //缓存区地址
fread(buffer,sizeof(int),9,fp); //将文件内容读取到buffer
for(int i = 0;i&lt;9;i++){
printf(&quot;%d &quot;,buffer[i]);
}
long lac2 = ftell(fp);
printf(&quot;\n结束文件位置:%ld&quot;,lac2); fclose(fp); //关闭文件
fp = NULL; //I/O流指针置NULL
return 0;

}

//运行结果

初始文件位置:8

2 3 4 5 6 7 8 0 0

结束文件位置:36 // 8 + ( 7 * 4 ) = 36

C标准库 操作文件的更多相关文章

  1. C++标准库头文件名字和C语言头文件名字的区别

    1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...

  2. C++标准库头文件找不到的问题

    当你写C++程序时,在头文件中包含C++标准库的头文件,比如#include <string>,而编译器提示你找不到头文件! 原因就是你的实现源文件扩展名是".c"而不 ...

  3. 标准库头文件 (CA2T)

    标准库中,CA2T,CA2W的头文件是: #include <atlstr.h>

  4. C++标准库头文件<bits/stdc++.h>

    在使用GNU GCC Compiler的时候,你可以包含一个头文件<bits/stdc++.h>,便可以使用C++中的各种标准库,而不用一个一个包含进来. 这在acm比赛中是一种常用的做法 ...

  5. C++版本的C标准库头文件的特点

    C++标准库中除了定义C++语言特有的功能外,也兼容了C语言的标准库.C语言的头文件形如name.h,C++则将这些文件命名为cname.也就是去掉了.h后缀,而在文件名name之前添加了字母c,这里 ...

  6. [C++STDlib基础]关于C标准输入输出的操作——C++标准库头文件<cstdio>

    网上实例 总结 /* _STD_BEGIN using _CSTD clearerr; using _CSTD fclose; using _CSTD feof; using _CSTD ferror ...

  7. [C++STDlib基础]关于日期时间的操作——C++标准库头文件<ctime>

    总结 /* A.头文件<ctime> #if _GLOBAL_USING && !defined(RC_INVOKED) _STD_BEGIN 1.四个数据类型 using ...

  8. [C++STDlib基础]关于单字符的操作——C++标准库头文件<cctype>

    网上实例 总结 /* _STD_BEGIN using _CSTD isalnum; using _CSTD isalpha; using _CSTD iscntrl; using _CSTD isd ...

  9. 8 标准库C文件

    使用标准C库时,下面哪个选项使用只读模式打开文件. A fopen("foo.txt","r");//r 打开只读文件 B fopen("foo.tx ...

  10. C 标准库头文件

    头文件 说明 头文件 说明 <assert.h> 条件编译宏,将参数与零比较 <complex.h> (C99 起) 复数运算 <ctype.h> 用来确定包含于字 ...

随机推荐

  1. GIL和池的概念

    1.GIL概念 1. 什么是GIL(为Cpython解释器) GIL本身就是一把互斥锁. 原理都一样. 都是让并发的线程同一时间只能执行一个 所以有了GIL的存在. 同一进程下的多个线程同一时刻只能有 ...

  2. 2023 年十大 API 管理趋势

    本文探讨了 API 管理在数字化转型中的重要性,以及 API 管理面临的挑战和发展机遇.文章重点介绍了十大 API 管理发展趋势,包括 API 安全性.API 标准化.云端 API 管理解决方案.低代 ...

  3. RabbitMQ详解(上)

    一:MQ的相关概念 MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而已,还是一种跨进程的通信机制,用于上下游传递消息.在 ...

  4. OpenCv人脸检测技术-(实现抖音特效-给人脸戴上墨镜)

    OpenCv人脸检测技术-(实现抖音特效-给人脸戴上墨镜) 本文章用的是Python库里的OpenCv. OpenCv相关函数说明 import cv2 # 导入OpenCv库 cv2.imread( ...

  5. 突破传统监测模式:业务状态监控HM的新思路

    作者:京东保险 管顺利 一.传统监控系统的盲区,如何打造业务状态监控. 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性,关于一致性的补偿,已经由算法部的大佬总结过就不在赘述.这里主要讲如 ...

  6. C# 闭包类对弱引用的坑

    闭包.弱引用的简单概念,大佬们描述的很多,有不了解的可以看看: 理解C#中的闭包 - 黑洞视界 - 博客园 (cnblogs.com) C#弱引用(WeakReference) - 简书 (jians ...

  7. boot-admin整合Liquibase实现数据库版本管理

    Liquibase 和 Flyway 是两款成熟的.优秀的.开源/商业版的数据库版本管理工具,鉴于 Flyway 的社区版本对 Oracle 数据库支持存在限制,所以 boot-admin 选择整合 ...

  8. 2023-04-27:用go语言重写ffmpeg的remuxing.c示例。

    2023-04-27:用go语言重写ffmpeg的remuxing.c示例. 答案2023-04-27: ffmpeg的remuxing.c是一个用于将多媒体文件从一种容器格式转换为另一种容器格式的命 ...

  9. 2022-12-27:etcd是无界面的,不好看,joinsunsoft/etcdv3-browser是etcd的web可视化工具之一。请问在k3s中部署,yaml如何写?

    2022-12-27:etcd是无界面的,不好看,joinsunsoft/etcdv3-browser是etcd的web可视化工具之一.请问在k3s中部署,yaml如何写? 答案2022-12-27: ...

  10. 2022-09-18:以下go语言代码输出什么?A:1;B:15;C:panic index out of range;D:doesn’t compile。 package main import

    2022-09-18:以下go语言代码输出什么?A:1:B:15:C:panic index out of range:D:doesn't compile. package main import ( ...