zoukankan      html  css  js  c++  java
  • 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下,该方式会看到行结尾符由一个 两个字符组成;在linux下则只有一个 ;在苹果机下面则是 ;如果以文本方式打开(不加b的模式),C语言在调用fread的时候会将文本视图的行尾符统一转化成 ,然后在调用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个字符,因为最后一个字符必须是结束符‘’。相反的,如果写入text的字符串的长度超过了19,即text的第20个字节的位置无法存入‘’结束符,就会造成越界,这时候多出来的数据就会占据后面紧接的内存。越界后,如果再答应text, C语言就会一直打印到找到第一个''为止,实际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);

    }

  • 相关阅读:
    (论坛答疑点滴)DataGrid模板列中控件的事件中怎么知道是哪行触发的事件?
    (论坛答疑点滴)怎么后台添加CheckBoxList并且得到选择结果
    (论坛答疑点滴)联合主键的情况怎么在DataGrid中利用DataKeys定位记录?
    (原创)按照一定的格式生成一定数量的随机数的例子
    (原创)DataGrid动态添加模板列的一个例子
    有的时候看似是对的往往是不对的
    (论坛答疑点滴)如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证
    (论坛答疑点滴)怎么触发DataGrid模板列中控件的事件?
    (原创)利用vs.net快速开发windows服务(c#)
    (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
  • 原文地址:https://www.cnblogs.com/iRidescent-ZONE/p/3157684.html
Copyright © 2011-2022 走看看