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. ASP.NET Core - 缓存之分布式缓存

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...

  2. 快速上手Linux核心命令(六):Linux的文本编辑器vi和vim

    @ 目录 前言 简介 小试牛刀 vi/vim 工作原理及三种模式 常用快捷键 命令行图解 前言 上一篇中已经预告,我们这篇主要说Linux中vi/vim 编辑器.它是我们使用Linux系统不可缺少的工 ...

  3. [C++提高编程] 2、STL初识

    文章目录 2 STL初识 2.1 STL的诞生 2.2 STL基本概念 2.3 STL六大组件 2.4 STL中容器.算法.迭代器 2.5 容器算法迭代器初识 2.5.1 vector存放内置数据类型 ...

  4. 2020-11-01:rust中带move闭包和不带move闭包有什么区别?

    福哥答案2020-11-01: 1.是否是同一个变量:带move闭包,函数外和函数内的同名变量不是同一个变量.不带move闭包,函数外和函数内的同名变量是同一个变量.2.执行完闭包后:带move闭包, ...

  5. 数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)[xgboots/lightgbm/Catboost等模型]--模型融合:stacking、blending

    数据挖掘实践(金融风控):金融风控之贷款违约预测挑战赛(上篇)[xgboots/lightgbm/Catboost等模型]--模型融合:stacking.blending 1.赛题简介 赛题以金融风控 ...

  6. 一文读懂面试官都在问的Log4J2漏洞

    CVE-2021-44228 漏洞简介 Apache Log4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录. 2021年11 ...

  7. 源端为备库的场景下Duplicate失败问题

    环境: Oracle 11.2.0.3 + OEL 7.9 A -> B -> C 级联ADG环境:db11g -> db11gadg -> db11gcas 之前测试提到,从 ...

  8. Serverless冷扩机器在压测中被击穿问题

    一.现象回顾 在今天ForceBot全链路压测中,有位同事负责的服务做Serverless扩容(负载达到50%之后自动扩容并上线接入流量)中,发现新扩容的机器被击穿,监控如下(关注2:40-3:15时 ...

  9. SignalR WebSocket通讯机制

    1.什么是SignalR ASP.NET SignalR 是一个面向 ASP.NET 开发人员的库,可简化向应用程序添加实时 Web 功能的过程. 实时 Web 功能是让服务器代码在可用时立即将内容推 ...

  10. TypeError: Cannot read property 'getAttribute' of undefined

    今天使用echarts + vue 做 图标,运行时提示vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in mounted hook: "Typ ...