## 1、二进制I/O
此前介绍的标准I/O函数都是面向文本地,用于处理字符和字符串。在使用这种I/O函数处理数值型数据时,会将数值转换为字符串。
```C
double num = 1/3;
fprintf(fp, "%f", num);
```
以上代码,将num存储为字符:0.333333。当改变转换说明时,也将改变存储num所需的空间数量,导致num被存储为不同的值。当使用%.2f时,致使num的精度损失,且无法恢复。
为了使数值数据在存储前后保持一致,最精确的做法是使用与计算机相同的位组合来存储它们。
如果以程序所用的表示法把数据存储在文件中,则称以***二进制模式***存储数据。在此模式下,不存在从数值型到字符串地转换过程。
## 2、二进制I/O函数:fread()和fwrite()
### (1)fwrite()
```C
size_t fwrite(const void* restrict ptr, size_t size, size_t nmemb, FILE* restrict fp);
```
函数功能:将二进制数据写入文件。
指针ptr是待写入数据块的地址
size表示待写入数据块的大小(以字节为单位)
nmemb表示待写入数据块的数量
fp指向待写入的文件
```C
char buffer[256];
fwrite(buffer, 256, 1, fp); // 将一块256字节的数据从buffer中写入fp所指定的文件。
double num[10];
fwrite(num, sizeof(double), 10, fp); // 将一个内含10个double类型值的数组写入文件,数据被分为分10份
```
### (2)fread()
```C
size_t fread(void* restrict ptr, size_t size, size_t nmemb, FILE* restrict fp);
```
ptr是待读取文件数据在内存中的地址
fp指向待读取文件
此函数用于读取被fwrite()写入文件的数据。
```C
double num[10];
fread(num, sizeof(double), 10, fp); //从fp指向的文件中读取10个double类型的值,存入num数组
```
## 3、文件结尾和读写出错
### (1)文件结尾
```C
int feof(FILE* fp);
```
如果标准输入函数返回EOF,则feof()返回一个非0值,否则返回0。
### (2)文件读写出错
```C
int ferror(FILE* fp);
```
当读或写出现错误时,ferror()返回一个非0值,否则返回0。C基础——文件I/O (5)
原文:https://blog.51cto.com/u_15058552/2900527