C标准库 操作文件
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)
操作文件的步骤
- 声明文件I/O流指针
- 打开文件
- 对文件的操作
- 关闭文件,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,"%s %d","清光照归途",520); //将"清光照归途 520"写入文件中 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,"%s %d","清光照归途",520); //将"清光照归途 520"写入文件中 char str[101];
int num ; //str和num用于存放从文件中读取的数据
fscanf(fp,"%s %d",str,&num);
printf("读取到的内容为:%s %d",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<9;i++){
printf("%d ",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("初始文件位置:%ld\n",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<9;i++){
printf("%d ",buffer[i]);
}
long lac2 = ftell(fp);
printf("\n结束文件位置:%ld",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标准库 操作文件的更多相关文章
- C++标准库头文件名字和C语言头文件名字的区别
1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...
- C++标准库头文件找不到的问题
当你写C++程序时,在头文件中包含C++标准库的头文件,比如#include <string>,而编译器提示你找不到头文件! 原因就是你的实现源文件扩展名是".c"而不 ...
- 标准库头文件 (CA2T)
标准库中,CA2T,CA2W的头文件是: #include <atlstr.h>
- C++标准库头文件<bits/stdc++.h>
在使用GNU GCC Compiler的时候,你可以包含一个头文件<bits/stdc++.h>,便可以使用C++中的各种标准库,而不用一个一个包含进来. 这在acm比赛中是一种常用的做法 ...
- C++版本的C标准库头文件的特点
C++标准库中除了定义C++语言特有的功能外,也兼容了C语言的标准库.C语言的头文件形如name.h,C++则将这些文件命名为cname.也就是去掉了.h后缀,而在文件名name之前添加了字母c,这里 ...
- [C++STDlib基础]关于C标准输入输出的操作——C++标准库头文件<cstdio>
网上实例 总结 /* _STD_BEGIN using _CSTD clearerr; using _CSTD fclose; using _CSTD feof; using _CSTD ferror ...
- [C++STDlib基础]关于日期时间的操作——C++标准库头文件<ctime>
总结 /* A.头文件<ctime> #if _GLOBAL_USING && !defined(RC_INVOKED) _STD_BEGIN 1.四个数据类型 using ...
- [C++STDlib基础]关于单字符的操作——C++标准库头文件<cctype>
网上实例 总结 /* _STD_BEGIN using _CSTD isalnum; using _CSTD isalpha; using _CSTD iscntrl; using _CSTD isd ...
- 8 标准库C文件
使用标准C库时,下面哪个选项使用只读模式打开文件. A fopen("foo.txt","r");//r 打开只读文件 B fopen("foo.tx ...
- C 标准库头文件
头文件 说明 头文件 说明 <assert.h> 条件编译宏,将参数与零比较 <complex.h> (C99 起) 复数运算 <ctype.h> 用来确定包含于字 ...
随机推荐
- 【Spring注解驱动】(二)AOP及一些扩展原理
1 AOP动态代理简介及功能实现 1.1 简介 指在程序运行期间动态地将某段代码切入到指定方法的指定位置进行运行的方式. 1.2 功能实现测试 功能:实现在业务逻辑运行的时候将日志打印 ①导入aop模 ...
- Rust中的derive属性详解
1. Rust中的derive是什么? 在Rust语言中,derive是一个属性,它可以让编译器为一些特性提供基本的实现.这些特性仍然可以手动实现,以获得更复杂的行为. 2. derive的出现解决了 ...
- uniapp directive 在原生 wgt 包不生效 uniapp directive 不生效
需求 根据权限编码禁用按钮 阻止当前 dom 绑定的点击事件,禁用状态(opacity 半透明?? 或者 display: none?? ) 尝试 开发环境用 Chrome 跑,一切正常,构建打包后去 ...
- AI人工智能 机器学习 深度学习 学习路径及推荐书籍
要学习Pytorch,需要掌握以下基本知识: 编程语言:Pytorch使用Python作为主要编程语言,因此需要熟悉Python编程语言. 线性代数和微积分:Pytorch主要用于深度学习领域,深度学 ...
- Appweb+ESP学习笔记
Appweb+ESP学习笔记 1.Appweb简介 Appweb HTTP Web服务器是最快的小型Web服务器.这是一个高性能,紧凑的嵌入式网络服务器,具有模块化,安全的核心.它支持广 ...
- Sql Server 数据库事务与锁,同一事务更新又查询锁?期望大家来解惑
我有一个People表,有三行数据: 如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段 SQL 开启了事务,并且在事务中进行了更新和查询操作. BEGIN TRAN up ...
- [C++核心编程] 2、引用
文章目录 2 引用 2.1 引用的基本使用 2.2 引用注意事项 2.3 引用做函数参数 2.4 引用做函数返回值 2.5 引用的本质 2.6 常量引用 2 引用 2.1 引用的基本使用 **作用: ...
- [数据库]MYSQL之授予/查验binlog权限
在后端做主从备份:亦或是在大数据领域中,各类CDC同步(Canal / Flink CDC等),均会基于MYSQL的binlog来实现. 因此,知道需要哪些权限?怎么查验去.怎么授权就很重要了. 感觉 ...
- Grafana 系列-统一展示-3-Prometheus 仪表板
系列文章 Grafana 系列文章 知识储备 Prometheus Template Variables 你可以使用变量来代替硬编码的细节,如 server.app 和 pod_name 在 metr ...
- 音视频八股文(12)-- ffmpeg 音频重采样
1重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率.sample format.声道数等参数,使之按照我们期望的参数输出. 1.2 为什么要重采样 为什么要重采样?当然是原有的⾳频参数 ...