C文件读写(二进制/文本文件)整理
目录
打开文件
使用fopen
打开文件,在<stdio.h>
头文件中,其声明如下:
FILE * fopen ( const char * filename, const char * mode );
需要指定文件名参数filename
以及mode
参数来说明用哪种方式打开。
mode
参数所支持的字符串有:
参数 | 说明 |
---|---|
"r" | read: 打开文件作为读取(输入)对象,文件必须已存在。 |
"w" | write: 打开一个空文件作为写入(输出)对象。如果同名文件已存在,那么其原有内容将会被舍弃,然后当成空白文件开始写入内容。 |
"a" | append: 打开一个文件在其末尾写入内容。如果文件不存在则会被创建。读写指针重定位操作(如fseek 、fsetpos 、rewind )将会被忽略。 |
"r+" | read/update: 打开一个现存文件用于更新(同时支持读取和写入,后通)。 |
"w+" | write/update: 打开一个空白文件用于更新。如果同名文件已存在,那么其中的内容则会被舍弃,当成新的空白文件对待。 |
"a+" | append/update: 打开一个文件用于更新,其中所有输出操作都在文件末尾进行。重定位操作只会影响下一次读取操作,随后读写指针会回到文件末尾。如果文件不存在,则会重新创建。 |
使用以上mode
说明符,文件将以文本形式打开。为了以二进制(binary)形式打开文件,mode
说明符中必须包含b
字符。使用方法可以是:"rb"、"wb"、"ab"、"r+b"、"w+b"、"a+b",后三种也可以是:"rb+"、"wb+"、"ab+"。
例子:
/* fopen example */
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ("myfile.txt","w");
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
fclose (pFile);
}
return 0;
}
关闭文件
可以使用fclose
关闭文件,在<stdio.h>
头文件中,其声明如下:
int fclose ( FILE * stream );
输入的参数是一个FILE
对象的指针,用来指定要关闭的stream。若成功关闭,会返回0,否则会返回EOF。见上例。
二进制写入
使用fwrite
写入二进制内容,其声明在<stdio.h>
文件中:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
共有4个输入参数,分别为:
ptr
: 待写入的数组的指针,会被转化为const void *
类型。
size
: 每个待写入元素的字节大小,size_t
为无符号整型变量。
count
: 待写入的元素的个数。注:因此最后写入文件的大小为count*size
。
stream
: FILE
对象指针,指定一个输出stream。
例子:以二进制形式将二维数组写入文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("C_fwrite.bin","wb");
double m[2][3] = {{1.0,2.0,3.0},{4.0,5.0,6.0}};
if (fp != NULL) {
// 写入二维数组
fwrite(m,sizeof(double),2*3,fp);
}
fclose(fp);
return 0;
}
二进制读取
使用fread
读取二进制文件,其声明在<stdio.h>
中:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
共有4个参数,意义同fwrite
。
例子:继续上一个例子,把写入二进制文件中的数组读取并打印出来
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("C_fwrite.bin","rb");
double m[2][3]={{0.0}};
if (fp != NULL) {
fread(m,sizeof(double),6,fp);
}
fclose(fp);
for (int i = 0; i < 2; ++i)
for (int j = 0; j < 3; ++j)
printf("m[%d][%d]=%f\n",i,j,m[i][j]);
return 0;
}
编译运行后的结果:
m[0][0]=1.000000
m[0][1]=2.000000
m[0][2]=3.000000
m[1][0]=4.000000
m[1][1]=5.000000
m[1][2]=6.000000
文本文件写入
使用fprintf
将C格式化字符串写入文件流中,其声明在<stdio.h>
中:
int fprintf ( FILE * stream, const char * format, ... );
共有3个参数:
stream
: FILE
对象指针,指定一个文件流。
format
: 格式化字符串,包含待写入文件流的C字符串。其中可以嵌入格式说明符(format specifiers,以%开头)
。
...(additional arguments)
: 附加参数。如果format
中含有格式说明符,则需要添加对应的附加参数。格式化字符串中的格式说明符会被替换成指定格式的附加参数的值。
格式说明符遵循以下原型(prototype):
%[flags][width][.precision][length]specifier
其后的说明字符(specifier character)是最重要的,因为它定义了相关参数的类型和解释:
说明符 | 输出 | 实例 |
---|---|---|
d 或i |
有符号十进制整数 | -123, 123 |
u |
无符号十进制整数 | 123 |
o |
无符号八进制 | 0o173 |
x |
无符号十六进制整数 | 0x7b |
X |
无符号十六进制整数,大写 | 0X7B |
f |
十进制浮点数,小写 | 10.123 |
F |
十进制浮点数,大写,C99 | 10.123 |
e |
科学计数法(尾数/指数),小写 | 1.0123e+1 |
E |
科学计数法(尾数/小数),大写 | 1.0123E+1 |
g |
使用最短表达:%e 或 %f |
10.123 |
G |
使用最短表达:%E 或%F |
10.123 |
a |
十六进制浮点数,小写,C99 | 0x1.43ef9ep+3 |
A |
十六进制浮点数,大写,C99 | 0X1.43EF9EP+3 |
c |
字符 | a |
s |
字符串 | |
p |
指针地址 | b8000000 |
n |
不打印任何东西。 相应的参数必须为指向符号整数的一个指针,到目前为止写入的符号数被存入指向的位置 |
|
% |
%后面跟一个%将会输出%本身 |
格式说明符
还能包含子说明符
:flags
占位符,width
宽度,.precision
精度,modifier
(按此顺序),这些都是可选的,下面是各子说明符
说明:
flags
占位符
占位符 | 说明 |
---|---|
- |
给定的区域宽度中左对齐;默认是右对齐的。 |
+ |
在结果之前添加符号(+或-)。默认情况下,只有负数前面会添加-号。 |
(space) |
如果没有写入符号,那么就会插入一个空格。 |
# |
使用o ,x 或X 说明符,对于不为0的值前面就会带上0 ,0x 或0X 。使用a ,A ,e ,E ,f ,F ,g 或G 时,即使没有更多数字,也会添加一个小数点。默认情况下,如果没有小数点后面没有数字,那么就不会写入小数点。 |
0 |
左边使用0 来填充(替换原来的空格填充) |
width
宽度
宽度 | 说明 |
---|---|
(number) |
指定输出的最小字符数。如果要输出的值比这个数还小,结果会以空格填充。即使结果值比较大,也不会截断。 |
* |
宽度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。(?) |
.precition
精度
精度 | 说明 |
---|---|
.number |
对于整数说明符(d , i , o , u , x , X ),precision 指定要写入的最小位数。如果要写入的值比这个数短,结果就会以0填充。即便要写入的值比这个数长,也不会被截断。对于 a , A , e , E , f , F 说明符,这个数指定小数点后的位数,默认值为6。对于 g 和G 说明符,这个数指定尾数的最大位数。对于 s ,这个数指定输出的最大字符数,默认情况下所有字符都会被输出,直到末尾遇到null字符串。 |
.* |
精度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。 |
例子:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("C_fprintf.txt","w");
fprintf(fp, "整数:\n");
fprintf(fp, "-123 d:%d\n", -123);
fprintf(fp, " 123 d:%d\n", 123);
fprintf(fp, "-123 i:%i\n", -123);
fprintf(fp, " 123 i:%i\n", 123);
fprintf(fp, "-123 u:%u\n", -123);
fprintf(fp, " 123 u:%u\n", 123);
fprintf(fp, "-123 o:%o\n", -123);
fprintf(fp, " 123 o:%o\n", 123);
fprintf(fp, "-123 x:%x\n", -123);
fprintf(fp, " 123 x:%x\n", 123);
fprintf(fp, "-123 X:%X\n", -123);
fprintf(fp, " 123 X:%X\n", 123);
fprintf(fp, "浮点数:\n");
fprintf(fp, "10.123 f:%f\n",10.123);
fprintf(fp, "10.123 C99 F:%F\n",10.123);
fprintf(fp, "10.123 e:%e\n",10.123);
fprintf(fp, "10.123 E:%E\n",10.123);
fprintf(fp, "10.123 g:%g\n",10.123);
fprintf(fp, "10.123 G:%G\n",10.123);
fprintf(fp, "10.123 a:%a\n",10.123);
fprintf(fp, "10.123 A:%A\n",10.123);
fprintf(fp, "字符(串):\n");
fprintf(fp, "a\n");
fprintf(fp, "hello\n");
fprintf(fp, "指针地址:\n");
int a = 1;
fprintf(fp, "int指针地址 &a=%p\n",&a );
fprintf(fp, "%%\n");
fclose(fp);
return 0;
}
编译运行后结果:
整数:
-123 d:-123
123 d:123
-123 i:-123
123 i:123
-123 u:4294967173
123 u:123
-123 o:37777777605
123 o:173
-123 x:ffffff85
123 x:7b
-123 X:FFFFFF85
123 X:7B
浮点数:
10.123 f:10.123000
10.123 C99 F:
10.123 e:1.012300e+001
10.123 E:1.012300E+001
10.123 g:10.123
10.123 G:10.123
10.123 a:0x1.43ef9ep+3
10.123 A:0X1.43EF9EP+3
字符(串):
a
hello
指针地址:
&a=000000000061FE44
%
文本文件读取
使用fscanf
从文件流中按指定格式读取数据,其声明在<stdio.h>
文件中:
int fscanf ( FILE * stream, const char * format, ... );
共有3个参数:
stream
: FILE
对象指针,指定一个文件流。
format
: 包含一系列字符的C字符串,这些字符用来控制从文件流中提取数据的格式:
- 空白符:函数会读取并忽略在非空白字符前的任何空白符(空白符包括空格、换行以及缩进符,即一般所说的\s, \n, \t等)。
- 非空白符(除%外):函数会继续从文件流中读取下一个非空白或格式说明福之外的字符。
- 格式说明符:有百分号开头的一个字符序列指定一个格式说明符,它被用来指定从文件流中读取数据的格式和类型。
... (additional arguments)
: 附加参数。用来指定format
中格式字符串所提取到的字符的存储位置,按指定的类型存储。因此,其数量要和格式字符串的数量相同。
fscanf
所使用的格式说明符遵循以下原型(prototype):
%[*][width][length]specifier
相关说明类似于fprintf
。
例子:读取上一个例子中生成的C_fprintf.txt
中的前3个元素
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char s1[10],s2[10];
int d;
FILE *fp = fopen("C_fprintf.txt","r");
fscanf(fp,"%s %d %s",s1,&d,s2);
printf("have read:\n%s \n%d \n%s\n",s1,d,s2 );
return 0;
}
编译运行后的结果:
have read:
整数:
-123
d:-123
C文件读写(二进制/文本文件)整理的更多相关文章
- C++文件读写(转载)
原网页地址:http://blog.csdn.net/kingstar158/article/details/6859379 下文全部转载自以上网页,感谢原作者的贡献. 在看C++编程思想中,每个练习 ...
- c++文件读写相关
在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: ...
- 【转载】C++文件读写详解(ofstream,ifstream,fstream)
原文:http://blog.csdn.net/kingstar158/article/details/6859379 在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,f ...
- ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0,现把学习结果分享一下,希望对新手有帮助. 目录 ActionScript 3.0简介 Hello ...
- [转]ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调
本文转自:http://www.cnblogs.com/artwl/p/3396330.html 近期项目中可能要用到Flash存取数据,并与JS互调,所以就看了一下ActionScript 3.0, ...
- C++文件读写详解(ofstream,ifstream,fstream)
C++文件读写详解(ofstream,ifstream,fstream) 这里主要是讨论fstream的内容: #include <fstream> ofstream //文件写操作 内存 ...
- 转载-Python学习笔记之文件读写
Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...
- Matlab之文件读写
读文件: (0)自己添加 你可以将txt的一些文本数据直接拷贝到matlab窗口,然后保存为mat文件,下次就可以直接采用load函数了. (1)Load load 从Matlab的数据文件.mat ...
- C之文件读写
1.fopen() fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能:为使用而打开一个流,把一个文件和此 ...
随机推荐
- GitBook 常用插件
目录 必看说明 插件说明 page-treeview 目录 code 代码 pageview-count 阅读量计数 popup 图片点击查看 tbfed-pagefooter 页面添加页脚(简单版) ...
- Spine学习八 - 幻影特效
Spine支持一些自带的特效,这些特效,不需要在spine中制作,而只是通过在unity中添加一些脚本便可实现. 这里先讲解一个比较使用又酷炫的效果,幻影特效: 1. 首先,在SkeletonAnim ...
- 分数运算(gcd)
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 计算机中采用浮点数表示所有实数,但这意味着精度丢失.例如无法精确 ...
- Weights and Measures (贪心+dp)
I know, up on top you are seeing great sights, But down at the bottom, we, too, should have rights. ...
- 11 vue 自定义全局方法
//global.js// 定义vue 全局方 // 定义vue 全局方法 建议自定义的全局方法加_ 以示区分 export default { install(Vue, options = ...
- PyTorch ResNet 使用与源码解析
本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson8/resnet_inference.py 这篇文章首先会简 ...
- 如何使用JSTL获取并显示数据
首先在×××controller里查询数据,并绑定,代码如下: /** * 显示所有租借信息 默认进入这个方法 * * @param resp * @param req * @param manage ...
- 2020重新出发,NOSQL,MongoDB分布式集群架构
MongoDB分布式集群架构 看到这里相信你已经掌握了 MongoDB 的大部分基本知识,现在在单机环境下操作 MongoDB 已经不存在问题,但是单机环境只适合学习和开发测试,在实际的生产环境中,M ...
- Python日志功能与处理逻辑
前言 在应用程序执行过程中,我们希望通过规范格式输出程序执行的详细信息,这时我们需要用到日志功能.在Python语言中,有个內建模块logging能够很好的实现日志功能.整体来说,logging配置可 ...
- JS -- DOM(文档对象模型)
认识DOM(文档对象模型) DOM(Document Object Model):定义访问和处理HTML文档的标准方法. DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). < ...