zoukankan      html  css  js  c++  java
  • fread,fwrite(二)

    一个小demo

    #include <stdio.h>
    int main(void)
    {
        int  arr[5] = { 0 };
        FILE* file = fopen("a.txt", "r+");
        fread(arr, 4, 4, file);
        for(int i = 0; i < 4; i++) {
            printf("arr[%d] is %d
    ", i, arr[i]);
        }
    fclose(file);
    return 0; }

    其中a.txt长这样

    结果

     出乎我的意料,一串莫名其妙的数据

    思考:a.txt显示0001001等数字,实际存储的是什么,猜测是ASCII码,用ghex打开看看,果不其然

     右侧是我们看到的,左侧是实际保存时的ascii码值(16进制,省略了0x,0x30代表48,而48是ASCII码0),

    又因为825241648 =   49*2^24+48*2^16+48*2^8+48

    170995760 =  10*2^24+49*2^16+48*2^8+48

    所以arr数组前2个元素(8个字节)内存中布局应该是,一个表格代表1个字节

    48 48 48 49 48 48 49 10

    arr[0]    地址低                                                                  arr[1]            地址高

     电脑是小端的,显示为0x12345678的在内存中按地址从小到大是0x78,0x56,0x34,0x12

    内存中48,48,48,49(地址从低到高) 与文件保存的顺序一模一样。

    照着这个思路:

    #include <stdio.h>

    int main(void)
    {
        int arr[4] = {97,66, 0x6768, 0x10345678};
        FILE* file = fopen("a.txt", "w+");
        fwrite(arr, 4, 4, file);
        fclose(file);
    }

    文件中内容,仅考虑值是0  0  0   97,0  0  0  66,0   0  0x67  0x68 ,0x10 0x34  0x56  0x78

    考虑大小端是(电脑是小端)97  0  0 0 ,66  0 0  0,  0x68   0x67  0   0, 0x78  0x56  0x34   0x10 

    按顺序用ASCII码表示(a NUL NUL NUL B NUL NUL  NUL  h   g  NUL  NUL  x  V  4  LF)NUL是ASCII码0,LF是换行符

    用ghex查看

     

  • 相关阅读:
    CentOS 7.4 发布下载,安全稳定的Linux发行版
    PHP缓存机制详解
    用FastDFS一步步搭建文件管理系统
    linux中mv命令使用详解
    linux grep命令详解
    音频放大器的设计
    C#学习笔记(九)——集合、比较和转换
    Kinect学习笔记(五)——更专业的深度图
    C#学习笔记(八)——定义类的成员
    kinect学习笔记(四)——各种数据流
  • 原文地址:https://www.cnblogs.com/goodluck14/p/13222391.html
Copyright © 2011-2022 走看看