C语言中的fread和fwrite

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);

}