C中文件的输入输出与C++的文件流
C中文件输入输出
文件的缓冲区:
每一个被使用的文件都在内存中用一个FILE结构体来存储相应的文件信息(如文件的名字、文件的状态、文件当前位置等)。FILE的定义在stdio.h中
typedef struct
{short level; //缓冲区“满”的程度unsigned flags; //文件状态标志char fd;//文件描述符unsigned char hold;//如缓冲区无内容不读取字符short bsize;//缓冲区的大小unsigned char* buffer;//缓冲区位置unsigned char* curp;//指针当前的指向unsigned istemp; //临时文件指示器short token; //用于有效性检查
}FILE;
注:不同的编译器的FILE类型略有不同。例如,VC6.0中
struct _iobuf {char *_ptr;int _cnt;char *_base;int _flag;int _file;int _charbuf;int _bufsiz;char *_tmpfname;};
typedef struct _iobuf FILE;
一般使用文件类型指针,FILE* fp(注:它指向内存中的文件信息区(即FILE)的开头,而不是指向外部介质上的数据文件的开头)。
FILE* fp;
fp = fopen("test.txt","w");//以只写的方式打开文件
...
fclose(fp);//关闭文件
文件打开方式 | 若指定文件不存在 |
"r"(只读) | 出错 |
"w"(只写) | 建立新文件,若文件存在,内容被销毁 |
"a"(追加) | 出错(自测VC6可以打开,新建一个空文件,应该编译器默认添加了w) |
"rb"(二进制文件的只读) | 出错 |
"wb"(二进制文件的只读) | 建立新文件,若文件存在,内容被销毁 |
"ab"(二进制文件的追加) | 出错 |
"r+"(读写) | 出错 |
"w+"(读写) | 建立新文件,若文件存在,内容被销毁 |
"a+"(读写) | 出错(自测VC6可以打开,新建一个空文件,应该编译器默认添加了w) |
"rb+"(二进制文件的读写) | 出错 |
"wb+"(二进制文件的读写) | 建立新文件,若文件存在,内容被销毁 |
"ab+"(二进制文件的读写) | 出错(自测VC6可以打开,新建一个空文件,应该编译器默认添加了w) |
注:加b的表示对二进制文件操作,默认(不加b)对文本文件操作。a(append)表示在文件末尾写入。
常用下面的方法打开一个文件
if((fp=fopen("filename","r"))==NULL)
{printf("打开文件失败!");exit(0);
}
向文件读写的函数
fgetc(fp) 或 getc(fp) | 从fp指向的文件读入一个字符 | 成功,返回读到的字符,失败返回文件结束标志EOF(即-1) |
fput(ch, fp) 或 putc(ch, fp) | 把字符ch写到文件中去 | 成功,返回写入的字符,失败返回EOF |
fgets(char* str, int n, FILE* fp) | 从文件读入一个长度为n-1的字符串,存到字符数组str中 | 成功,返回str的地址,失败返回NULL |
fput(char* str, FILE* fp) | 把字符串str写入文件中 | 成功返回0,失败返回非0 |
fprintf(文件指针, 格式字符串, 输出列表) | 以格式化的方式写文件 | |
fscanf(文件指针, 格式字符串, 输入列表) | 以格式化的方式读文件 | |
fwrite(const void *, size_t, size_t, FILE *) | 向文件中写一个数据块 | |
fread(void *, size_t, size_t, FILE *) | 从文件中读一个数据块 |
最最常用的是 fread 和 fwrite 函数,它们在读写时是以二进制的方式进行的,速度快。
fread(void *buffer, size_t size, size_t count, FILE * fp)
fwrite(const void *buffer, size_t size, size_t count, FILE *fp)
buffer 是一个地址
size:要读写的字节数
count:要读写多少个数据项(每个数据项的长度为size)
fp:文件指针 成功返回count,失败返回小于 count 的整数,
注意:用”w+"打开时,用fwrite写入后就用fread读有点问题。不知为何?建议“w“和”r”分开读写。知道了原因:写入后文件位置标记(或称文件位置指针)是在文件的末尾,应该把标记定位到文件头再读文件。
- 文件位置标记(文件位置指针)
文件位置标记是指“接下来要读写的下一个字符的位置”,它随文件的读或写向后移动。
改变文件标记的位置:
void rewind(FILE* fp):使文件标记指向文件开头。
int fseek(FILE* fp, long offset, int origin); origin表示起始点,offset表示相对起始点的偏移量(正数向后偏移,负值向前偏移),成功返回0,失败返回非0值。
origin可以取值0,1,2;0表示文件头位置,1表示当前位置,2表示文件末尾位置。
#define SEEK_SET 0 //文件的开头位置
#define SEEK_CUR 1
#define SEEK_END 2
long ftell(FILE* fp); 获取文件文件位置标记的当前位置。是用相对于文件头的位移量来表示。成功返回位置,失败返回-1L。
feof(fp) 若标记到文件末尾,再读文件,该函数就返回1。否则返回0
还有一些文件读写的函数:
ferror(fp) 若文件的输入输出出错了,该函数返回非0值,未出错返回0。
clearerr(fp) 清空错误,使文件错误标志和文件结束标志置为0。当ferror函数为非0值后,应该调用clearerr函数,使ferror(fp)的值为0,以便下次检查。
FILE的知识:www.cnblogs.com/lxy2015/p/5302365.html
转载于:https://www.cnblogs.com/htj10/p/10728143.html
C中文件的输入输出与C++的文件流相关推荐
- c++怎么输入带有空格的字符串_CCF CSP-J/S中常用的输入输出 总结(三)
实验环境: DEV-C++ 5.11 六.关于文件的输入输出 七.关于string类型变量的赋值和连接操作 八.关于string类型的主要函数和运算 六.关于文件的输入输出 需要使用头文件#inclu ...
- c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出
指针: 1.指针的概念: 内存区的每一个字节有一个编号,这就是 '地址',由于通过地址能找到所需的变量单元,而地址指向该变量单元,所以将地址形象化称为 '指针'.C/C++中是可多继承的指针,而Jav ...
- linux 文件操作 编程,Linux系统编程------------文件操作(基础)
一.文件操作 1.1 Linux文件系统结构 1.1.1 Linux常见系统目录 /bin : 存放普通系统可执行的命令(ls wc等) /sbin : 存放系统管理程序(fsck等) /b ...
- [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式...
ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...
- CAD中插入外部参照字体会变繁体_CAD相关文件及输入输出的相关问题
CAD用到的各种文件格式,你都知道吗? 与CAD相关的文件扩展名 如何快速识别DWG版本? 用什么办法可以转版本? CAD打开图纸的方法汇总 CAD文件选择对话框中添加常用文件夹 CAD不同版本文件有 ...
- 《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件
第5章 Core组件进阶 5.6 输入输出XML和YAML文件 5.6.1 XML和YAML文件 XML和YAML是使用非常广泛的文件格式,可以利用XML或者YAML式的文件存储和还原各种数据结构,还 ...
- C++中基本的输入输出
1.Cpp中基本的输入输出 C++标准库提供了一组丰富的输入/输出功能,将在后续的章节进行介绍.本章将讨论C++编程中最基本和最常见的I/O操作.C++的I/O发生在流中,流是字节序列.如果字节流是从 ...
- OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用
基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...
- Python核心编程读笔 8: 文件和输入输出
第九章 文件和输入输出 一.文件内建函数.方法.属性 1 文件内建函数 file_object = open(file_name, access_mode='r', buffering=-1) 工厂函 ...
最新文章
- 对比React Native、dcloud、LuaView三个框架技术(内部)
- iptables防火墙策略
- OpenCV中MeanShift算法视频移动对象分析
- javascript常用排序算法总结
- java环境变量设置的作用_JDK环境变量的配置及作用
- 围棋经典棋谱_秀秀老师:茶艺师也要学好围棋
- 证券期货业信息系统安全等级保护基本要求》送审
- markdown 本地链接_markdown多平台发布及七牛图床使用
- iBATIS的自定义类型处理器TypeHandlerCallback解决乱码
- 用inno 打包程序 学习之路(转载)
- Spring BeanFactory和FactoryBean的区别
- 【plantuml】程序员绘图工具
- CCS6图文安装教程
- JAVA汽车4S店管理系统
- 网贷查询接口开发 网贷黑名单查询 个人网贷黑名单查询
- [转]人生就像一张茶几,摆满了各种杯具洗具餐具
- Spring AOP 的术语
- 2、二叉树的后序遍历
- STC单片机获取红外解码从串口输出
- linux启动和关闭防火墙命令
热门文章
- fzu2202 犯罪嫌疑人
- Flex中添加大量组件时内存占用问题
- asp.net中后台javaScrip的使用
- linux 自动登录
- 解决php保存文件时文件名乱码问题
- 2003下使用IIS+PHP+MySQL来运行DZ(落伍记号)
- 图解再谈ssh port forwarding-ssh隧道技术
- UML建模之时序图(Sequence Diagram)转
- C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字
- 2013-我的前事今生(完结篇)