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++的文件流相关推荐

  1. c++怎么输入带有空格的字符串_CCF CSP-J/S中常用的输入输出 总结(三)

    实验环境: DEV-C++ 5.11 六.关于文件的输入输出 七.关于string类型变量的赋值和连接操作 八.关于string类型的主要函数和运算 六.关于文件的输入输出 需要使用头文件#inclu ...

  2. c语言record的作用,C语言基础 record 2-指针,结构体,链表,文件的输入输出

    指针: 1.指针的概念: 内存区的每一个字节有一个编号,这就是 '地址',由于通过地址能找到所需的变量单元,而地址指向该变量单元,所以将地址形象化称为 '指针'.C/C++中是可多继承的指针,而Jav ...

  3. linux 文件操作 编程,Linux系统编程------------文件操作(基础)

    一.文件操作 1.1 Linux文件系统结构 1.1.1  Linux常见系统目录 /bin  :  存放普通系统可执行的命令(ls wc等) /sbin  :  存放系统管理程序(fsck等) /b ...

  4. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式...

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  5. CAD中插入外部参照字体会变繁体_CAD相关文件及输入输出的相关问题

    CAD用到的各种文件格式,你都知道吗? 与CAD相关的文件扩展名 如何快速识别DWG版本? 用什么办法可以转版本? CAD打开图纸的方法汇总 CAD文件选择对话框中添加常用文件夹 CAD不同版本文件有 ...

  6. 《OpenCV3编程入门》学习笔记5 Core组件进阶(六)输入输出XML和YAML文件

    第5章 Core组件进阶 5.6 输入输出XML和YAML文件 5.6.1 XML和YAML文件 XML和YAML是使用非常广泛的文件格式,可以利用XML或者YAML式的文件存储和还原各种数据结构,还 ...

  7. C++中基本的输入输出

    1.Cpp中基本的输入输出 C++标准库提供了一组丰富的输入/输出功能,将在后续的章节进行介绍.本章将讨论C++编程中最基本和最常见的I/O操作.C++的I/O发生在流中,流是字节序列.如果字节流是从 ...

  8. OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用

    基本绘图 目的 本节你将学到: 如何用 Point 在图像中定义 2D 点 如何以及为何使用 Scalar 用OpenCV的函数 line 绘 直线 用OpenCV的函数 ellipse 绘 椭圆 用 ...

  9. Python核心编程读笔 8: 文件和输入输出

    第九章 文件和输入输出 一.文件内建函数.方法.属性 1 文件内建函数 file_object = open(file_name, access_mode='r', buffering=-1) 工厂函 ...

最新文章

  1. 对比React Native、dcloud、LuaView三个框架技术(内部)
  2. iptables防火墙策略
  3. OpenCV中MeanShift算法视频移动对象分析
  4. javascript常用排序算法总结
  5. java环境变量设置的作用_JDK环境变量的配置及作用
  6. 围棋经典棋谱_秀秀老师:茶艺师也要学好围棋
  7. 证券期货业信息系统安全等级保护基本要求》送审
  8. markdown 本地链接_markdown多平台发布及七牛图床使用
  9. iBATIS的自定义类型处理器TypeHandlerCallback解决乱码
  10. 用inno 打包程序 学习之路(转载)
  11. Spring BeanFactory和FactoryBean的区别
  12. 【plantuml】程序员绘图工具
  13. CCS6图文安装教程
  14. JAVA汽车4S店管理系统
  15. 网贷查询接口开发 网贷黑名单查询 个人网贷黑名单查询
  16. [转]人生就像一张茶几,摆满了各种杯具洗具餐具
  17. Spring AOP 的术语
  18. 2、二叉树的后序遍历
  19. STC单片机获取红外解码从串口输出
  20. linux启动和关闭防火墙命令

热门文章

  1. fzu2202 犯罪嫌疑人
  2. Flex中添加大量组件时内存占用问题
  3. asp.net中后台javaScrip的使用
  4. linux 自动登录
  5. 解决php保存文件时文件名乱码问题
  6. 2003下使用IIS+PHP+MySQL来运行DZ(落伍记号)
  7. 图解再谈ssh port forwarding-ssh隧道技术
  8. UML建模之时序图(Sequence Diagram)转
  9. C#+OpenGL+FreeType显示3D文字(3) - 用PointSprite绘制文字
  10. 2013-我的前事今生(完结篇)