C语言中的fread和fwrite是专门用来操作文件的方法。
1. fread负责从打开的文件指针中读取文件内容。
函数原型:size_t fread(void *p, size_t size, size_t num, FILE *fp);
参数*p:一个指针,通常是字符串指针,也可以是一个数组,用来存放从文件流中读取的数据;
参数size:表示读取一个单位元素的大小,以字节为单位,比如sizeof(char)或者sizeof(int)等;
参数num:表示一次单位元素的数量,和size参数一样,都是无符号整数类型;
参数*fp:当然就是文件流指针了,即我们需要操作的文件;
返回值:正常情况下,返回成功读取的单位元素的数目,这个值小于等于我们传入的参数num。如果发生错误或者遇到文件结尾,返回0。这个时候我们可以用feof和ferror函数去检查到底发生了什么情况。
2. fwrite和fread相对应,负责将准备好的数据写入到文件流中。通常情况下,这个函数执行完的时候,只是将数据写入了缓存,磁盘的文件中并不会立即出现刚刚写入的数据,在调用fclose之后,计算机才将缓存中的数据写入磁盘。
函数原型:size_t fwrite(void *p, size_t size, size_t num, FILE *fp);
fwrite和fread的参数要表达的意思是一样的,不同的是将*p中的数据写入到文件流中,以及返回值表示成功写入的数目。
简单列子:将一个文件的内容拷贝到另一个文件中
#include <stdio>
int main(void)
{
// 读模式的方式打开第一个文件流,并且以二进制流的方式。由于二进制的方式,C语言不进行任何转换,所以如果在windows下,该方式会看到行结尾符由一个\r\n两个字符组成;在linux下则只有一个\n;在苹果机下面则是\r;如果以文本方式打开(不加b的模式),C语言在调用fread的时候会将文本视图的行尾符统一转化成\n,然后在调用fwrite的时候再根据操作系统转化成相应的行尾符。
FILE *fp1 = fopen("text1.txt", "rb");
if (!fp1)
printf("The text1.txt open failed!");
FILE *fp2 = fopen("text2.txt", "wb");
if (!fp2)
printf("The text2.txt open failed!");
// 动态申请20个char类型大小的内存空间,由于char是字符串指针,所以最多存放19个字符,因为最后一个字符必须是结束符‘\0’。相反的,如果写入text的字符串的长度超过了19,即text的第20个字节的位置无法存入‘\0’结束符,就会造成越界,这时候多出来的数据就会占据后面紧接的内存。越界后,如果再答应text, C语言就会一直打印到找到第一个'\0'为止,实际text的字符长度就会大于20。所以text一定要有足够大的空间来存储一次读取的数据块大小。
char *text = (char *)calloc(20, sizeof(char));
if (!feof(fp1) && !ferror(fp1))
{
size_t num = fread(*text, sizeof(char), 19, *fp1);
fwrite(*text, sizeof(char), num, *fp2);
}
fclose(fp1);
fclose(fp2);
}