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. 免安装Oracle客户端使用PLSQL Developer 7/8 连接Oracle10/11g

    众所周知,Oralce的客户端几百兆太大,网上也有许多DIR的处理.这里的处理使用官方提供ORALCE工具包Instant Client Package! 下载地址:http://www.oracle ...

  2. CharsetUtils.java

    /* * Copyright (c) 2013. * * Licensed under the Apache License, Version 2.0 (the "License" ...

  3. Sublime 编译出来的是 dos格式,不是unix格式

    在windows下编辑一般都这样的 :set ff=unix就好

  4. mysql随机更新时间

    UPDATE data_arch_point SET click_time = DATE_ADD('2016-06-15 00:00:00', INTERVAL )) SECOND) WHERE DA ...

  5. PyDev-Python的Eclipse插件安装

    PyDev官网:http://marketplace.eclipse.org/node/114 安装方法: 1,打开Eclipse,如果是初次使用,关闭欢迎页面,否则无法按照我说的方法安装. 2,打开 ...

  6. mongodb csv 文件导入数据库,删除特定字段

    1. 导入数据库 mongoimport -h host_ip -p port -d db_name -c collection_name --fields name1,name2,name3,nam ...

  7. [经验总结]利用xlstproc处理XSLT的makefile

    转自:http://blog.csdn.net/thinkhy/article/details/5343739 # For XSLT PARSE = xsltproc SRC = main.xml S ...

  8. [Flex] PopUpButton系列 —— 控制弹出菜单的透明度、可用、可选择状态

    <?xml version="1.0" encoding="utf-8"?><!--控制弹出菜单的透明度.可用.可选择状态 PopUpButt ...

  9. data-icon=""图片还可以是自定义的?

    自定义的图片怎么写啊? data-icon = "地址" 不对啊????? 不是写地址,而是设置css 比如 data-icon="mm" 那么在css中肯定有 ...

  10. java GUI之事件处理

    常见事件及相应事件源类型 事件源 用户操作 事件 JButton 点击按钮 ActionEvent JTextField 在文本域按回车键 ActionEvent JCheckBox 点击复选框 Ac ...