因此,提供了下列两个函数以执行二进制I/O操作。

#include <stdio.h>

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

这些函数有以下两种常见的用法:

  • 读写一个二进制数组。例如,为了将一个浮点数组的第2~5个元素写至一文件上,可以编写如下程序:
float data[10];

if(fwrite(&data[2], sizeof(float), 4, fp) != 4)
{
    err_sys("fwrite error");
}
  • 读或写一个结构。例如,可以编写如下程序:
struct{
    short count;
    long total;
    char name[NAMESIZE];
} item;

if(fwrite(&item, sizeof(item), 1, fp) != 1){
    err_sys("fwrite error");
}

使用二进制I/O的基本问题是,他只能用于读在同一系统上已写的数据。

多年之前,这并无问题(那时,所有UNIX系统都运行于PDP-11上),而现在,很多异构系统通过网络相互链接起来,而且,这种情况已经非常普遍。

编者注:PDP-11为迪吉多电脑于1970到1980年代所销售的一系列16位迷你电脑。

常常有这种情形,在一个系统上写的数据,要在另一个系统上进行处理。

在这种环境下,这两个函数可能就不能正常工作,其原因是:

  1. 在一个结构中,同一成员的偏移量可能随编译程序和系统的不同而不同(由于不同的对齐要求)。确实,某些编译程序有一个选项,选择它的不同值,或者使结构中的各成员紧密包装(这可以节省存储空间,而运行性能则有所下降);或者准确对齐(以便在运行时易于存取结构中的各成员)。这意味着即使在同一个系统上,一个结构的二进制存放方式也可能因编译程序的选项不同而不同。
  2. 用来存储多字节整数和浮点值的二进制格式在不同的系统结构间也可能不同。

results matching ""

    No results matching ""