user-0 提问: 请教如何把结构体数组里的内容用fwrite写到文本文件？谢谢

回复:
user: user-1
content: https://www.baidu.com/s?wd=winhex%E6%95%99%E7%A8%8B&rsp=4&f=1&oq=WinHex&tn=baiduhome_pg&ie=utf-8&usm=1&rsv_idx=2&rsv_pq=f96434d900082d2a&rsv_t=57e2tJP6il%2BLmOmz%2BAI55pGTS1gmXa4qFL2oozXa%2FUPT0uvvvfp62zB2APNqZfV7dEq%2B&rsv_ers=xn1&rs_src=0

user: user-1
content: 引用 12 楼 startstop2015 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 谢谢，我看不懂，请教如何用winhex查看结构体数组里保存的内容？[/quote] 参考WinHex联机帮助和网上相关博客文章。 https://www.baidu.com/s?wd=WinHex&rsv_spt=1&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&oq=WinHex&rsv_t=b89bhqvghZ9KJ39cyIMmBG7JlkSxv8bcp7lbRrPMKO99GWwYA%2BINke%2BJRuaVThZ%2FebB%2F&rsv_pq=f2d7376a000834ec

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 谢谢，我看不懂，请教如何用winhex查看结构体数组里保存的内容？

user: user-1
content: 去问微软。

user: user-2
content: 引用 9 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了为什么要替换啊 赵老师

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 如何结构体  引用 7 楼 zhao4zhong1 的回复:[/code] 谢谢 struct stru_salary {   double  salary[100][15];   char    name[100][15]; };  struct stru_salary *array_sal; array_sal=(struct stru_salary *)malloc(sizeof(struct stru_salary));  此时，我发现不能直接fwrite这个结构体数组，格式是乱的  假设array_sal有100条记录，如何把这100条记录memcpy到其它内存区域， 假设其它内存区域名字是A,然后把A一次性用fwrite写到文本？

user: user-1
content: 仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-3
content: 一般工作中数据保存, 建议是保存二进制数据, 这时所有数据都是二进制保存在文件中, 查看数据需要UtralEdit这样的二进制数据查看工具.  当然, 如果只为学习, 为了所有数据都以字符串方式展现, 那就格式化成字符串, 然后保存, 读取的时候把字符串再转换回来

user: user-4
content: 格式化输入比较好，读起来也容易

user: user-5
content: 如果要写入文本的话，不能用fwrite了，得用fprintf格式化输出文本。写一个函数，专门负责结体的输出

user: user-5
content: 这跟写入一般变量是一样的，参考例子：  struct A { 	int data; };  int main() {    	A a; 	a.data = 1; 	FILE* pfile; 	pfile = fopen("test.txt", "w"); 	fwrite(&a, sizeof(a), 1, pfile); 	fclose(pfile);     return 0;    }

user: user-0
content: 引用 1 楼 user-6 的回复:二进制打开写入 谢谢，是写入文本文件啊，具体该怎么实现？

user: user-6
content: 二进制打开写入