C语言如何将字符串写入二进制文件中?这个文件存储的应该是二进制数据,用记事本打开是乱码

wsckxs 2014-11-12 12:45:38
有一个.ini文件,里面有一些数据,为了提高读写的速率,需要把这些数据提取出来写入二进制文件
...全文
1254 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
有点清眸 2014-11-15
  • 打赏
  • 举报
回复
二进制读写和文本读写是两个概念。 字符数据本身在内存中就经过了编码,所以无论是二进制还是文本形式都是一样的,而对于非字符数据来说,例如inti=10;如果用二进制来进行存储的话为1010,但是如果需要用文本形式来进行存储的话就必须进行格式化编码(对1和0分别编码,即形式为‘1’和‘0’分别对应的码值)
wsckxs 2014-11-14
  • 打赏
  • 举报
回复
引用 27 楼 ForestDB 的回复:
你老师所说的0x0990 到底是0x0990?还是"0x0990"? 还请先弄清楚。
字符串“0X0990”
luciferisnotsatan 2014-11-13
  • 打赏
  • 举报
回复
引用 18 楼 wsckxs 的回复:
[quote=引用 17 楼 luciferisnotsatan 的回复:] ‘0' 这个字符的ACSII码值是 0x30。 unsigned short 的值为0x30时,它代表数值为0么?
额,应该不是吧。。什么意思啊不懂。。[/quote] char a = '0'; // 相当于 char a = 0x30 unsigned short b = a; ------------------------------------------------ unsigned short b = 0; 一个是给b 赋值 48, 一个是赋值 0. 这个和big endian没什么关系,你在同一台机器上运行的,没这个问题。
ForestDB 2014-11-13
  • 打赏
  • 举报
回复
你老师所说的0x0990 到底是0x0990?还是"0x0990"? 还请先弄清楚。
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 25 楼 ForestDB 的回复:
不过看LZ的标题,似乎应该是 char * i = "0x0990"; 如果是这样的化,就该 int ii = atoi(i); 然后再 fwrtie(&ii, sizeof(int), 1 file);
什么意思?运行一下结果没道理啊
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 16 楼 wsckxs 的回复:
[quote=引用 13 楼 luciferisnotsatan 的回复:] [quote=引用 10 楼 wsckxs 的回复:] [quote=引用 8 楼 ForestDB 的回复:] int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
其实我也是这么写的,老师说结果不对[/quote] 你是不是直接把 ini 里的内容读出来然后直接写到 dat 里? 感觉你老师说的是: 从 ini 里读到字符串 “0x0990”, 然后转成 unsigned short(两字节)值,再存到 dat 里 [/quote]我确实是直接写到dat里了,为什么要转换为unsigned short?[/quote]老师之前提到过要big endian,我不知道什么意思,是不是跟这个有关啊
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 17 楼 luciferisnotsatan 的回复:
‘0' 这个字符的ACSII码值是 0x30。 unsigned short 的值为0x30时,它代表数值为0么?
额,应该不是吧。。什么意思啊不懂。。
luciferisnotsatan 2014-11-13
  • 打赏
  • 举报
回复
‘0' 这个字符的ACSII码值是 0x30。 unsigned short 的值为0x30时,它代表数值为0么?
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 13 楼 luciferisnotsatan 的回复:
[quote=引用 10 楼 wsckxs 的回复:] [quote=引用 8 楼 ForestDB 的回复:] int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
其实我也是这么写的,老师说结果不对[/quote] 你是不是直接把 ini 里的内容读出来然后直接写到 dat 里? 感觉你老师说的是: 从 ini 里读到字符串 “0x0990”, 然后转成 unsigned short(两字节)值,再存到 dat 里 [/quote]我确实是直接写到dat里了,为什么要转换为unsigned short?
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 8 楼 ForestDB 的回复:
int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
00000000 00000001是这样吧
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 13 楼 luciferisnotsatan 的回复:
[quote=引用 10 楼 wsckxs 的回复:] [quote=引用 8 楼 ForestDB 的回复:] int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
其实我也是这么写的,老师说结果不对[/quote] 你是不是直接把 ini 里的内容读出来然后直接写到 dat 里? 感觉你老师说的是: 从 ini 里读到字符串 “0x0990”, 然后转成 unsigned short(两字节)值,再存到 dat 里 [/quote]为什么???
ForestDB 2014-11-13
  • 打赏
  • 举报
回复
不过看LZ的标题,似乎应该是 char * i = "0x0990"; 如果是这样的化,就该 int ii = atoi(i); 然后再 fwrtie(&ii, sizeof(int), 1 file);
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 23 楼 ForestDB 的回复:
int i = 0x0990; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file);
这样是不对的,我这么写老师说不对。。 我想是不是应该将0990这样的十六进制数据写入,像这样: sscanf( data, "%x", &j );//data[]字符数组存储数据0990,j是unsigned short格式 fwrite(&j,sizeof(unsigned short),1,fp2);
luciferisnotsatan 2014-11-13
  • 打赏
  • 举报
回复
引用 10 楼 wsckxs 的回复:
[quote=引用 8 楼 ForestDB 的回复:] int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
其实我也是这么写的,老师说结果不对[/quote] 你是不是直接把 ini 里的内容读出来然后直接写到 dat 里? 感觉你老师说的是: 从 ini 里读到字符串 “0x0990”, 然后转成 unsigned short(两字节)值,再存到 dat 里
ForestDB 2014-11-13
  • 打赏
  • 举报
回复
int i = 0x0990; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file);
707wk 2014-11-13
  • 打赏
  • 举报
回复
字符串只是二进制的一个表现形式
ForestDB 2014-11-13
  • 打赏
  • 举报
回复
引用 9 楼 wsckxs 的回复:
[quote=引用 8 楼 ForestDB 的回复:] int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
REG_BURST= 0x0990, 0x000C, 0x0000, 0x002B, 0x0000, 0x0006, 0x0000, 0x035A, 0x02D0这样的数据[/quote] LZ想多了,我就是问我的代码执行后test.dat中应该有什么。
wsckxs 2014-11-13
  • 打赏
  • 举报
回复
引用 21 楼 ForestDB 的回复:
[quote=引用 15 楼 wsckxs 的回复:] [quote=引用 8 楼 ForestDB 的回复:] int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
00000000 00000001是这样吧[/quote] 差不多,但是不太准确 0x00 0x00 0x00 0x01 如果你认为我说的和你说的是一回事,同时也知道大小端的问题,那么可以认为你理解了二进制文件 那么就是你没有理解老师的需求 [/quote]老师就是让把类似0x0990这样的数据以二进制形式写入文件,你觉得应该怎么做?
ForestDB 2014-11-13
  • 打赏
  • 举报
回复
引用 15 楼 wsckxs 的回复:
[quote=引用 8 楼 ForestDB 的回复:] int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
00000000 00000001是这样吧[/quote] 差不多,但是不太准确 0x00 0x00 0x00 0x01 如果你认为我说的和你说的是一回事,同时也知道大小端的问题,那么可以认为你理解了二进制文件 那么就是你没有理解老师的需求
wsckxs 2014-11-12
  • 打赏
  • 举报
回复
引用 8 楼 ForestDB 的回复:
int i = 1; FILE * file = fopen("test.dat", "wb"); fwrite(&i, sizeof(int), 1, file); fclose(file); test.dat中应该有什么?
其实我也是这么写的,老师说结果不对
加载更多回复(9)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧