揭开:apue2中fwrite二进制文件乱码

来源:互联网 发布:淘宝返利机器人原理 编辑:程序博客网 时间:2024/05/19 18:43

       在看《unix环境高级编程》的时候,Stevens蜻蜓点水的给读者留下了一个小问题,然而缺被这个小问题搞得一头雾水。好了,不多说了。问题参见《unix环境高级编程》中文版的P119,英文版P146。

       fwrite 函数使用二进制方式写文件。例如,一个整数如果用 4 个字节表示,则在文件中一个整数始终占有 4 个字节,不论整数的大小;与此不同,如果是用字符方式写文件,则一个整数在文件中占有的字节数与整数的大小(整型数字的个数)有关(当然还跟规定的格式有关,如果有的话)。

       对于二进制文件,它是用来被使用的(如读取、执行等),而不是用来看的(显示它的内容没有实际意义)。比如这个程序产生的二进制文件 datafile,它的作用就是用同样的结构体变量来读取,如上面的 jiutiao2004  给出的程序所示例的那样;这也是检查楼主的程序写 datafile 是否成功的可靠方法。


以下是fwrite写一个结构体源代码:

/* * fwrite.c * *  Created on: Nov 8, 2011 *      Author: robbin */#include <stdio.h>#include <stdlib.h>#include <errno.h>intmain(){    FILE *fp;    int i;    struct student{        char name[10];        int age;        float score[2];        char addr[15];    }stu;    if ((fp = fopen("datafile","wb+")) == NULL)        perror("fopen error");        printf("input your name age scoreA scoreB address\n");        for (i=0; i<2; i++){        scanf("%s %d %f %f %s",stu.name, \                &stu.age, &stu.score[0], &stu.score[1], stu.addr);                fwrite(&stu,sizeof(stu),1,fp);    }    fclose(fp);    exit(0);}

方法一:

写一个与之对应的fread读取这个datafile中的结构体。

代码如下:

/* * fread.c * *  Created on: Nov 8, 2011 *      Author: robbin */#include <stdio.h>#include <stdlib.h>#include <errno.h>struct student{    char name[10];    int age;    float score[2];    char addr[15];};intmain(void){     int     i;     FILE    *fp;     struct student ret;     if ((fp = fopen("datafile","r")) == NULL)        perror("fopen error");    for (i=2; i>0; i--){        fread(&ret,sizeof(struct student),1,fp);        printf("%s %d %f %f %s",ret.name, \                ret.age, ret.score[0], ret.score[1], ret.addr);    }     fclose(fp);    exit(0);}  

方法二:

在linux终端中输入以下命令:


od -c datafile
od将已ASCII格式读取文件。