user-0 提问: fwrite读写乱码

回复:
user: user-0
content: 引用 12 楼 mienfong 的回复:[quote=引用 7 楼 zhanglusmile 的回复:] [quote=引用 5 楼 mienfong 的回复:] 一般檔案的操作會用 char / unsigned char 的 Array 方式來存取，這樣在進行 fwrite/fread 時格式也會一致。 你的 pow_panel_array 有甚麼資料？或都說 struct 是長怎樣？	int i = 0; 	for(i=0; i<panelnum; i++){ 		if(!pow_panel_array[i].used){ 			pow_panel_array[i].panelhandle = panelhandle; 			pow_panel_array[i].used = 1; 			pow_panel_array[i].power_info = power_info; 			pow_panel_array[i].FirstShowPower = 1; 			pow_panel_array[i].FirstShowFrequencyDomain = 1; 			pow_panel_array[i].control_plothandle = -1; 			pow_panel_array[i].uncontrol_plothandle = -1; 			pow_panel_array[i].hzmaxval = 2500.0; 			pow_panel_array[i].hzminval = 0.0; 			pow_panel_array[i].k = 0; 			memset(pow_panel_array[i].double_data,0,sizeof(double)*8192); 			break; 		} 	}                  是一个数组，信号采集的样子[/quote]  這個 Array 是有 Struct 的，您的長度是不對的。 試試看這樣改  write_length =  fwrite(&pow_panel_array[i], 1, sizeof(struct), with_control_file);  注意，要把  sizeof(struct) 的 struct 換成實際的 struct 大小。[/quote]这样不太对吧，感觉fwrite输出还是有问题，用fprinft先试试

user: user-1
content: 注意：要把  sizeof(struct) 的 struct 換成實際的 struct 或者 手動寫入實際大小。

user: user-1
content: 引用 7 楼 zhanglusmile 的回复:[quote=引用 5 楼 mienfong 的回复:] 一般檔案的操作會用 char / unsigned char 的 Array 方式來存取，這樣在進行 fwrite/fread 時格式也會一致。 你的 pow_panel_array 有甚麼資料？或都說 struct 是長怎樣？	int i = 0; 	for(i=0; i<panelnum; i++){ 		if(!pow_panel_array[i].used){ 			pow_panel_array[i].panelhandle = panelhandle; 			pow_panel_array[i].used = 1; 			pow_panel_array[i].power_info = power_info; 			pow_panel_array[i].FirstShowPower = 1; 			pow_panel_array[i].FirstShowFrequencyDomain = 1; 			pow_panel_array[i].control_plothandle = -1; 			pow_panel_array[i].uncontrol_plothandle = -1; 			pow_panel_array[i].hzmaxval = 2500.0; 			pow_panel_array[i].hzminval = 0.0; 			pow_panel_array[i].k = 0; 			memset(pow_panel_array[i].double_data,0,sizeof(double)*8192); 			break; 		} 	}                  是一个数组，信号采集的样子[/quote]  這個 Array 是有 Struct 的，您的長度是不對的。 試試看這樣改  write_length =  fwrite(&pow_panel_array[i], 1, sizeof(struct), with_control_file);  注意，要把  sizeof(struct) 的 struct 換成實際的 struct 大小。

user: user-0
content: 引用 10 楼 fefe82 的回复:[quote=引用 6 楼 zhanglusmile 的回复:] [quote=引用 3 楼 zhanglusmile 的回复:] [quote=引用 2 楼 fefe82 的回复:] 想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西[/quote]    这样显示的是二进制，虽然不是乱码了 [/quote]   这可不是二进制，你在输出的时候没加空格，所有的数都连在一起了。[/quote]在哪里加空格啊？？麻烦您帮我下

user: user-2
content: 引用 6 楼 zhanglusmile 的回复:[quote=引用 3 楼 zhanglusmile 的回复:] [quote=引用 2 楼 fefe82 的回复:] 想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西[/quote]    这样显示的是二进制，虽然不是乱码了 [/quote]  这可不是二进制，你在输出的时候没加空格，所有的数都连在一起了。

user: user-3
content: http://bbs.csdn.net/topics/390676437

user: user-3
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: 引用 5 楼 mienfong 的回复:一般檔案的操作會用 char / unsigned char 的 Array 方式來存取，這樣在進行 fwrite/fread 時格式也會一致。 你的 pow_panel_array 有甚麼資料？或都說 struct 是長怎樣？	int i = 0; 	for(i=0; i<panelnum; i++){ 		if(!pow_panel_array[i].used){ 			pow_panel_array[i].panelhandle = panelhandle; 			pow_panel_array[i].used = 1; 			pow_panel_array[i].power_info = power_info; 			pow_panel_array[i].FirstShowPower = 1; 			pow_panel_array[i].FirstShowFrequencyDomain = 1; 			pow_panel_array[i].control_plothandle = -1; 			pow_panel_array[i].uncontrol_plothandle = -1; 			pow_panel_array[i].hzmaxval = 2500.0; 			pow_panel_array[i].hzminval = 0.0; 			pow_panel_array[i].k = 0; 			memset(pow_panel_array[i].double_data,0,sizeof(double)*8192); 			break; 		} 	}                  是一个数组，信号采集的样子

user: user-0
content: 引用 3 楼 zhanglusmile 的回复:[quote=引用 2 楼 fefe82 的回复:] 想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西[/quote]    这样显示的是二进制，虽然不是乱码了

user: user-1
content: 一般檔案的操作會用 char / unsigned char 的 Array 方式來存取，這樣在進行 fwrite/fread 時格式也會一致。 你的 pow_panel_array 有甚麼資料？或都說 struct 是長怎樣？

user: user-0
content: 引用 1 楼 qldsrx 的回复:你写入的是一个double而不是char，肯定是乱码了，不然你输出时用printf的格式化%d干嘛？直接%s不好吗？ 那我还是用另一个函数吗？

user: user-0
content: 引用 2 楼 fefe82 的回复:想用记事本看的话请使用 fprintf。   write_length =  fprintf(with_control_file, "%d",pow_panel_array[i].double_data); 可是我改成这样没结果啊，就是文本里没东西

user: user-2
content: 想用记事本看的话请使用 fprintf。

user: user-4
content: 你写入的是一个double而不是char，肯定是乱码了，不然你输出时用printf的格式化%d干嘛？直接%s不好吗？

user: user-5
content: 引用 楼主 zhanglusmile 的回复:int  Input() {      FILE *with_control_file  = NULL;       int write_length = 0;       with_control_file=fopen("with_control.txt","wb");      if(with_control_file == NULL)       {           return 0;       }       write_length =  fwrite(pow_panel_array[i].double_data,sizeof(short),512, with_control_file);     printf("write_length = %d\n", write_length);       fclose(with_control_file);     with_control_file = NULL;       return 0;    }    with_control_file=fopen("with_control.txt","wb"); //楼主你的文件是.txt文件此段代码"wb"中的b表示二进制改为 t 或 省略  参考8楼和9楼