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\n", 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查看