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

}

C语言中的fread和fwrite的更多相关文章

  1. C语言中access、_mkdir、sprintf、 fopen、fwrite函数

    int access(const char *filename, int amode); amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-. 这个函数还可以检查其它文件属 ...

  2. C语言中file文件指针概念及其操作 (转载)

    文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...

  3. 转]解析C语言中的sizeof

    解析C语言中的sizeof 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出 了其操作数的存储大小.操作数 ...

  4. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  5. C 语言中 setjmp 和 longjmp

    在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...

  6. c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  7. C语言中do...while(0)的妙用(转载)

    转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...

  8. C语言中,定义的含义?声明的含义?它们之间的区别是什么?

    在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...

  9. C++中函数的默认参数和C语言中volatile的学习

    1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...

随机推荐

  1. [tty与uart]理解线路规程的作用

    转自:http://biancheng.dnbcw.info/linux/336240.html Linux OS的设备驱动有相当经典的抽象思想以及分层思想.与通信世界里面的思想相一致. 一.在Lin ...

  2. SVN 分支及合并的介绍和实践---命令行

    写在前面 一些相关的概念和原理 进行分支开发的最佳实践 合并的分类 在 Eclipse 中进行合并操作 相关资源 写在前面 本文是由演讲整理而来的,介绍了 SVN 分支与合并的概念.流程和一些实际操作 ...

  3. Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

    原文地址:http://blog.csdn.net/wangyang1354/article/details/50757098 我们经常会遇到这样一种情景,就是在我们开发项目的时候经常会在一个类中调用 ...

  4. Spark作业调度

    Spark在任务提交时,主要存在于Driver和Executor的两个节点. (1)Driver的作用: 用于将所有要处理的RDD的操作转化为DAG,并且根据RDD DAG将JBO分割为多个Stage ...

  5. 用widthStep的方法来增加某范围的像素----与imageROI对比

    //用widthStep的方法来增加某范围的像素 //作者:sandy //时间:2015-10-5 #include <cv.h> #include <highgui.h> ...

  6. 关于GameObject.activeInHierarchy,activeSelf,SetActive

    activeSelf(read only只读):物体本身的active状态,对应于其在inspector中的checkbox是否被勾选activeInHierarchy(read only只读):物体 ...

  7. JAVA 聊天窗口

    //聊天窗口 import java.awt.*; import javax.swing.*; public class Jiemian9 extends JFrame{ JTextArea wby; ...

  8. Laravel 部署安装到虚拟主机的方法(折腾了一周,终于成功部署,原来是虚拟机不加载.env,谢谢莫回首http://lxl520.com/index.php/archives/88/!)

      作者:莫回首链接:https://www.zhihu.com/question/35497879/answer/111241182来源:知乎著作权归作者所有,转载请联系作者获得授权. 序 lara ...

  9. 在VMware虚拟机中配置DOS汇编开发环境!!

    操作系统:win7 32位 DOS环境:DosBox  下载:http://www.dosbox.com/ 选择当前适合自己版本,下载就可以了. 汇编编译器:MASM 5.0 下载:http://do ...

  10. PXE批量部署linux操作系统

    前言 在实际生产环境中,有时候我们会碰到为几十上百甚至上千台服务器安装Linux操作系统的需求,如果我们还是常规的去使用移动介质逐台安装,显然是一件低效又令人抓狂的事情,那要安装到何年何月啊?这对于我 ...