二进制IO

2014-07-25 13:30:34   最后更新: 2014-07-25 13:30:34   访问数量:603




标准IO库提供了两个函数进行二进制IO操作,与普通IO操作不同的是,二进制IO往往需要读写整个结构,一次循环处理一个字节,而不是仅仅某个字符,而如果通过调用 fputs 和 fgets 实现,由于二进制IO过程中可能会提供 null 字节而不能正确工作

 

size_t fread (void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fwrite (const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);

 

定义于 <stdio.h> 头文件中,返回读或写的对象数

 

  • ptr 指向需读写对象的首地址
  • size 为对象大小
  • nobj 为对象个数
  • fp 为读/写文件指针

注:restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码。如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。restrict 的出现是因为 C 语言本身固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码。

 

这两个函数有两种常见用法:

1. 读或写一个二进制数组

例如,下面的程序将一个浮点数组的10个元素以二进制的形式写到了文件上

/* * file: main.c * author: 龙泉居士 * date: 2013-06-11 10:35 */ #include <stdio.h> int main () { FILE *fp = fopen ("output.txt", "w"); float data[10] = {0, 12, 1.414, 3.562, 43213, 4214}; if (fwrite (data, sizeof(float), 10, fp) != 10) { perror ("fwrite error: "); return -1; } return 0; }

 

 

这种用法中,size 为每个数组元素的长度,nobj 为欲写的元素数

 

 

2. 读或写一个结构

例如,可以如下编写程序读写结构体:

/* * file: main.c * author: 龙泉居士 * date: 2013-06-11 15:46 */ #include <stdio.h> #include <string.h> #define NAMESIZE 1024 struct Str_tmp { short count; long total; char name[NAMESIZE]; }; int main () { struct Str_tmp item; scanf ("%s", item.name); item.count = strlen (item.name); item.total = 1024; FILE *fp = fopen ("output.txt", "w"); if (fwrite (&item, sizeof(item), 1, fp) != 1) { perror ("fwrite error: "); return -1; } return 0; }

 

其中指定size为结构的长度,nobj为1(对象数)

 

  • 需要注意的是这两个函数并不具有可移植性,原因是现今并没有统一的标准来规定系统如何存储数据,可以参看:套接字编程的常用函数中关于主机序的讲解

 






读书笔记      技术帖      linux      unix      c++      cpp      c语言      龙潭书斋      apue      unix环境高级编程      io      fread      fwrite      二进制     


京ICP备15018585号