码迷,mamicode.com
首页 > 编程语言 > 详细

C语言中二进制文件的读取

时间:2015-03-12 22:44:22      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

fwrite()与fprintf()是不同的。

fwrite将写入的数据作为文件的磁盘内容保存。fprintf将写入的数据的每个字符所对应的ASCII码作为文件的磁盘内容保存。fprintf做了一个转换的工作。

当打开文件时,记事本会自动把文件的磁盘内容作为ASCII码转换成对应的字符,然后再显示出来,即显示的是文本内容而不是磁盘内容。

例如,用fwrite向文件写入“65”时,文件的磁盘内容就是保存的65(磁盘上以二进制表示)。当用记事本打开文件时,记事本会读到65,并把65看作一个ASCII码,再把对应的字符“A”显示出来。因此屏幕上看到的文本内容是“A”。

而用fprintf向文件写入“65”时,文件的磁盘内容保存的是“6”和“5”这两个字符对应的ASCII码,分别是54和53。因此文件的磁盘内容是54和53。当用记事本打开文件时,记事本读到54,就显示出对应的“6”。再读到53,就显示出对应的“5”。
代码示例。
#include <stdio.h>
#include <stdlib.h>

void test()
{
    FILE *foutput = fopen("output", "w");
    int A = 65;
    char buffer[10000];
    int i = 0;
    int l;

/* Write data to file */
    fwrite(&A, sizeof(A), 1, foutput);
    fprintf(foutput, "%d", A);
    fclose(foutput);

/* Read data from file */
    foutput = fopen("output", "r");
    while (fread(buffer + i, sizeof(char), 1, foutput)) {
        ++i;
    }
    l = i;

/* Print data on screen */
    for (i = 0; i < l; ++i) {
        printf("buffer[%d] = %d\n", i, (int)buffer[i]);
    }
    printf("l = %d\n", l);
    fclose(foutput);
}

int main()
{
    test();
    return 0;
}

输出结果:

buffer[0] = 65
buffer[1] = 0
buffer[2] = 0
buffer[3] = 0
buffer[4] = 54
buffer[5] = 53
l = 6

打开“output”文件的显示结果:

技术分享

fwrite()的定义参考:http://www.cplusplus.com/reference/cstdio/fwrite/

同样的,fread()与fscanf()也有类似的区别。

fread将文件的磁盘内容直接读入。fscanf将文件的磁盘内容作为ASCII码转换成对应的字符,然后再读入,即读入的是文本内容而不是磁盘内容。

可以想象,如果用fscanf读取上面例子中的文件,每次读取一个字节。那么buffer中前6个字符保存的将是“A[NULL][NULL][NULL]65”。

另外,感觉C语言中的fopen()的打开模式“b”没有作用。例如是写“w”还是“wb”对fwritet和fprintf都没有影响。以前不明白二进制文件是怎么回事,原来是fprintf和fscanf做了一次转换。

C语言中二进制文件的读取

标签:

原文地址:http://my.oschina.net/chuqixiaozhu/blog/386384

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!