[TOC]
# 文件的顺序读写
按照字符读写文件fgetc,fputc
## 按照字符读写文件
### 写文件fputc
~~~
#include<stdio.h>
int fputc(int ch, FILE * stream);
功能: 将ch转换为unsigned char后写入stream指定的文件中
参数:
ch: 需要写入文件的字符
stream: 文件指针
返回值:
成功: 成功写入文件的字符
失败: 返回-1
~~~
1. 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,并将写入的字符放在文件开头。如需保留原有文件内容,并把写入的字符放在文件末尾,就必须以追加方式打开文件。不管以何种方式打开,被写入的文件若不存在时则创建该文件。
2. 每写入一个字符,文件内部位置指针向后移动一个字节
### 读文件fgetc
~~~
#include<stdio.h>
int fgetc(FILE * stream);
功能: 从stream指定的文件中读取一个字符
参数:
stream: 文件指针
返回值:
成功: 返回读取到的字符
失败: -1
~~~
在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。
注意:这个文件内部的位置指针与C语言中的指针不是一回事。位置指针仅仅是一个标志,表示文件读写到的位置,也就是读写到第几个字节,它不表示地址。文件每读写一次,位置指针就会移动一次,它不需要你在程序中定义和赋值,而是由系统自动设置,对用户是隐藏的
### 文件结尾feof
在c语言中,EOF表示文件结束符,在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件.这种以EOF为结束标志的文件,必须是文本文件.在文本文件中,数据都是以字符的ASCII代码值的形式存放的.我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用eof作为文件结束标志
> EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现
~~~
#define EOF(-1)
~~~
#### 对 EOF 的说明
EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回 EOF 时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()
当把数据以二进制形式存放到文件中时,就会有-1值出现,因此不能采用EOF作为二进制文件的结束标志.为解决这一个问题,ASCII c 提供一个feof函数,用来判断文件是否结束.feof函数即可以用来判断二进制文件又可以用来判断文本文件
~~~
#include<stdio.h>
int feof(FILE * stream);
功能: 检测是否读取到了文件结尾.判断的是最后一次"读操作的内容",不是当前位置内容(上一个内容)
参数:
stream: 文件指针
返回值:
非0值: 已经到文件结尾
0: 没有到文件结尾
~~~
feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是:
~~~
int feof ( FILE * fp );
~~~
当指向文件末尾时返回非零值,否则返回零值。
ferror() 函数用来判断文件操作是否出错,它的原型是:
~~~
int ferror ( FILE *fp );
~~~
出错时返回非零值,否则返回零值。
需要说明的是,文件出错是非常少见的情况,上面的示例基本能够保证将文件内的数据读取完毕。如果追求完美,也可以加上判断并给出提示
## 按照字符串读写文件
### 写文件fputs
写入成功返回非负数,失败返回 EOF
~~~
#include <stdio.h>
int fputs(const char * str, FILE * stream);
功能: 将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0'不写入文件
参数:
str: 字符串
stream: 文件指针
返回值:
成功: 0
失败: -1
~~~
### 读文件fgets
fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中
~~~
#include <stdio.h>
char * fgets(char * str, int size, FILE * stream);
功能:
从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符,读到文件结尾或是已读了size-1个字符为止,最后会自动加上字符'\0'作为字符串结束
参数:
str: 字符串,字符数组
size: 指定最大读取字符串的长度(size-1)
stream: 文件指针
返回值:
成功: 成功读取的字符串,也就是首地址
失败: 读到文件尾或出错NULL
~~~
## 按照格式化读写文件
### 写文件fprintf
~~~
#include<stdio.h>
int fprintf(FILE * stream, const char * format, ...);
功能:
根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符'\0'为止
参数:
stream: 已经打开的文件
format: 字符串格式,用法和printf()一样
返回值:
成功: 实际写入文件的字符个数
失败: -1
~~~
~~~
fprintf(fp, "%d %d %d\n", 1, 2, 3);
~~~
### 读文件fscanf
~~~
#include<stdio.h>
int fscanf(FILE * stream, const char * format, ...)
功能: 从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据
参数:
stream: 已经打开的文件
format: 字符串格式,用法和scanf()一样
返回值:
成功: 参数数目,成功转换的值的个数
失败: -1
~~~
~~~
int a = 0;
int b = 0;
int c = 0;
fscanf(fp, "%d %d %d\n", &a, &b, &c);
printf("a=%d, b=%d, c=%d\n", a, b, c);
~~~
## 按照块读写文件
fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()
对于 Windows 系统,使用 fread() 和 fwrite() 时应该以二进制的形式打开文件
### 写文件fwrite
~~~
#include<stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE * stream);
功能: 以数据块的方式给文件写入内容
参数:
ptr: 准备写入文件数据的地址
size: size_t为unsigned int类型,此参数指定写入文件内容的块数据大小
nmemb: 写入文件的块数,写入文件数据总大小为: `size * nmemb`
stream: 已经打开的文件指针
返回值:
成功: 实际成功写入文件数据的块数目,此值和nmemb相等
失败: 0
~~~
对参数的说明:
* ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
* size:表示每个数据块的字节数。
* nmemb:表示要读写的数据块的块数。
* stream:表示文件指针。
* 理论上,每次读写 size\*nmemb 个字节的数据
size\_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量
返回值:返回成功读写的块数,也即 nmemb。如果返回值小于 nmemb:
* 对于 fwrite() 来说,肯定发生了写入错误,用 ferror() 函数检测。
* 对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测
### 读文件fread
~~~
#include<stdio.h>
size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream);
功能: 以数据块的方式从文件中读取内容
参数:
ptr: 存放读取出来数据的内存空间
size: size_t为unsigned int类型,此参数指定读取文件内容的块数据大小
nmemb: 读取文件的块数,读取文件数据总大小: size*nmemb
stream: 已经打开的文件指针
返回值:
成功: 实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾.
失败: 0
~~~
- c语言
- 基础知识
- 变量和常量
- 宏定义和预处理
- 随机数
- register变量
- errno全局变量
- 静态变量
- 类型
- 数组
- 类型转换
- vs中c4996错误
- 数据类型和长度
- 二进制数,八进制数和十六进制数
- 位域
- typedef定义类型
- 函数和编译
- 函数调用惯例
- 函数进栈和出栈
- 函数
- 编译
- sizeof
- main函数接收参数
- 宏函数
- 目标文件和可执行文件有什么
- 强符号和弱符号
- 什么是链接
- 符号
- 强引用和弱引用
- 字符串处理函数
- sscanf
- 查找子字符串
- 字符串指针
- qt
- MFC
- 指针
- 简介
- 指针详解
- 案例
- 指针数组
- 偏移量
- 间接赋值
- 易错点
- 二级指针
- 结构体指针
- 字节对齐
- 函数指针
- 指针例子
- main接收用户输入
- 内存布局
- 内存分区
- 空间开辟和释放
- 堆空间操作字符串
- 内存处理函数
- 内存分页
- 内存模型
- 栈
- 栈溢出攻击
- 内存泄露
- 大小端存储法
- 寄存器
- 结构体
- 共用体
- 枚举
- 文件操作
- 文件到底是什么
- 文件打开和关闭
- 文件的顺序读写
- 文件的随机读写
- 文件复制
- FILE和缓冲区
- 文件大小
- 插入,删除,更改文件内容
- typeid
- 内部链接和外部链接
- 动态库
- 调试器
- 调试的概念
- vs调试
- 多文件编程
- extern关键字
- 头文件规范
- 标准库以及标准头文件
- 头文件只包含一次
- static
- 多线程
- 简介
- 创建线程threads.h
- 创建线程pthread
- gdb
- 简介
- mac使用gdb
- setjump和longjump
- 零拷贝
- gc
- 调试器原理
- c++
- c++简介
- c++对c的扩展
- ::作用域运算符
- 名字控制
- cpp对c的增强
- const
- 变量定义数组
- 尽量以const替换#define
- 引用
- 内联函数
- 函数默认参数
- 函数占位参数
- 函数重载
- extern "C"
- 类和对象
- 类封装
- 构造和析构
- 深浅拷贝
- explicit关键字
- 动态对象创建
- 静态成员
- 对象模型
- this
- 友元
- 单例
- 继承
- 多态
- 运算符重载
- 赋值重载
- 指针运算符(*,->)重载
- 前置和后置++
- 左移<<运算符重载
- 函数调用符重载
- 总结
- bool重载
- 模板
- 简介
- 普通函数和模板函数调用
- 模板的局限性
- 类模板
- 复数的模板类
- 类模板作为参数
- 类模板继承
- 类模板类内和类外实现
- 类模板和友元函数
- 类模板实现数组
- 类型转换
- 异常
- 异常基本语法
- 异常的接口声明
- 异常的栈解旋
- 异常的多态
- 标准异常库
- 自定义异常
- io
- 流的概念和类库结构
- 标准io流
- 标准输入流
- 标准输出流
- 文件读写
- STL
- 简介
- string容器
- vector容器
- deque容器
- stack容器
- queue容器
- list容器
- set/multiset容器
- map/multimap容器
- pair对组
- 深浅拷贝问题
- 使用时机
- 常用算法
- 函数对象
- 谓词
- 内建函数对象
- 函数对象适配器
- 空间适配器
- 常用遍历算法
- 查找算法
- 排序算法
- 拷贝和替换算法
- 算术生成算法
- 集合算法
- gcc
- GDB
- makefile
- visualstudio
- VisualAssistX
- 各种插件
- utf8编码
- 制作安装项目
- 编译模式
- 内存对齐
- 快捷键
- 自动补全
- 查看c++类内存布局
- FFmpeg
- ffmpeg架构
- 命令的基本格式
- 分解与复用
- 处理原始数据
- 录屏和音
- 滤镜
- 水印
- 音视频的拼接与裁剪
- 视频图片转换
- 直播
- ffplay
- 常见问题
- 多媒体文件处理
- ffmpeg代码结构
- 日志系统
- 处理流数据
- linux
- 系统调用
- 常用IO函数
- 文件操作函数
- 文件描述符复制
- 目录相关操作
- 时间相关函数
- 进程
- valgrind
- 进程通信
- 信号
- 信号产生函数
- 信号集
- 信号捕捉
- SIGCHLD信号
- 不可重入函数和可重入函数
- 进程组
- 会话
- 守护进程
- 线程
- 线程属性
- 互斥锁
- 读写锁
- 条件变量
- 信号量
- 网络
- 分层模型
- 协议格式
- TCP协议
- socket
- socket概念
- 网络字节序
- ip地址转换函数
- sockaddr数据结构
- 网络套接字函数
- socket模型创建流程图
- socket函数
- bind函数
- listen函数
- accept函数
- connect函数
- C/S模型-TCP
- 出错处理封装函数
- 多进程并发服务器
- 多线程并发服务器
- 多路I/O复用服务器
- select
- poll
- epoll
- epoll事件
- epoll例子
- epoll反应堆思想
- udp
- socket IPC(本地套接字domain)
- 其他常用函数
- libevent
- libevent简介