如何创建一个.bin文件并把一个字符串以二进制形式存储进去

gldcpp 2016-08-15 04:26:18
什么叫以二进制存储?是说的把字符串转为01码然后存储么?
一般什么情况下使用.dat和.bin文件,具体是什么区别
...全文
784 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-16
  • 打赏
  • 举报
回复
不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
paschen 版主 2016-08-16
  • 打赏
  • 举报
回复
引用 14 楼 gldcpp 的回复:
引用 10 楼 paschen 的回复:
[quote=引用 8 楼 gldcpp 的回复:] [quote=引用 7 楼 paschen 的回复:] http://blog.csdn.net/seu_xuxueqi/article/details/621904
对同一个文件我用fread 分别在r和rb模式下去读取内容,发现在r模式下遇到0x1a时就停止读取了,而rb模式则读取了全部内容。这里是否是说文本模式下读取时遇到0x1a当做文件尾来处理了? 这里的文件流是不是可以理解为open时将其中的内容载入内存,读取的时候就按指定的长度将其中的内容一个一个像“流”一样的读出来呢?这里二进制和文本模式在读取上的区别是不是只是对文件尾的判断不同呢?而对于写fwirte就只是在处理非字符串类型(如int)存储的方式不同么?
字符串 以\0结尾,以文本方式读可能读到 00 就结束了[/quote]这里的0X1A读取停止与00是读取结束是同样原因么?[/quote] 都是不可显示字符
gldcpp 2016-08-16
  • 打赏
  • 举报
回复
引用 10 楼 paschen 的回复:
引用 8 楼 gldcpp 的回复:
[quote=引用 7 楼 paschen 的回复:] http://blog.csdn.net/seu_xuxueqi/article/details/621904
对同一个文件我用fread 分别在r和rb模式下去读取内容,发现在r模式下遇到0x1a时就停止读取了,而rb模式则读取了全部内容。这里是否是说文本模式下读取时遇到0x1a当做文件尾来处理了? 这里的文件流是不是可以理解为open时将其中的内容载入内存,读取的时候就按指定的长度将其中的内容一个一个像“流”一样的读出来呢?这里二进制和文本模式在读取上的区别是不是只是对文件尾的判断不同呢?而对于写fwirte就只是在处理非字符串类型(如int)存储的方式不同么?
字符串 以\0结尾,以文本方式读可能读到 00 就结束了[/quote]这里的0X1A读取停止与00是读取结束是同样原因么?
gldcpp 2016-08-16
  • 打赏
  • 举报
回复
对同一个文件我用fread 分别在r和rb模式下去读取内容, 1、发现在r模式下遇到0x1a时就停止读取了,而rb模式则读取了全部内容。这里是否是说文本模式下读取时遇到0x1a当做文件尾来处理了? 2、 这里的文件流是不是可以理解为open时将其中的内容载入内存,读取的时候就按指定的长度将其中的内容一个一个像“流”一样的读出来呢? 3、这里二进制和文本模式在读取上的区别是不是只是对文件尾的判断不同呢?而对于写fwirte就只是在处理非字符串类型(如int)存储的方式不同么? 4、如果读操作时是先把文件内容载入到内存,这里是如何判断文件尾判断文件内容已经全部读完呢?内容写入内存时会自动在末尾加上一个标记表示文件尾么? 问题多多,烦请指教,谢谢!
幻夢之葉 2016-08-16
  • 打赏
  • 举报
回复
二进制存储指原原本本的字节码存储起来,文本存储在windows下会把\n转换为\r\n
paschen 版主 2016-08-16
  • 打赏
  • 举报
回复
引用 9 楼 gldcpp 的回复:
引用 7 楼 paschen 的回复:
http://blog.csdn.net/seu_xuxueqi/article/details/621904
fwrite中对于写入的长度测试发现即使超出实际写入字符串的长度也不会报错,这是不是会有越界的问题呢?
看似正确不代表正确
paschen 版主 2016-08-16
  • 打赏
  • 举报
回复
引用 8 楼 gldcpp 的回复:
引用 7 楼 paschen 的回复:
http://blog.csdn.net/seu_xuxueqi/article/details/621904
对同一个文件我用fread 分别在r和rb模式下去读取内容,发现在r模式下遇到0x1a时就停止读取了,而rb模式则读取了全部内容。这里是否是说文本模式下读取时遇到0x1a当做文件尾来处理了? 这里的文件流是不是可以理解为open时将其中的内容载入内存,读取的时候就按指定的长度将其中的内容一个一个像“流”一样的读出来呢?这里二进制和文本模式在读取上的区别是不是只是对文件尾的判断不同呢?而对于写fwirte就只是在处理非字符串类型(如int)存储的方式不同么?
字符串 以\0结尾,以文本方式读可能读到 00 就结束了
gldcpp 2016-08-16
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
http://blog.csdn.net/seu_xuxueqi/article/details/621904
fwrite中对于写入的长度测试发现即使超出实际写入字符串的长度也不会报错,这是不是会有越界的问题呢?
gldcpp 2016-08-16
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
http://blog.csdn.net/seu_xuxueqi/article/details/621904
对同一个文件我用fread 分别在r和rb模式下去读取内容,发现在r模式下遇到0x1a时就停止读取了,而rb模式则读取了全部内容。这里是否是说文本模式下读取时遇到0x1a当做文件尾来处理了? 这里的文件流是不是可以理解为open时将其中的内容载入内存,读取的时候就按指定的长度将其中的内容一个一个像“流”一样的读出来呢?这里二进制和文本模式在读取上的区别是不是只是对文件尾的判断不同呢?而对于写fwirte就只是在处理非字符串类型(如int)存储的方式不同么?
赵4老师 2016-08-15
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
  • 打赏
  • 举报
回复
计算机里面的所有的一切都是以二进制存储的啊。。。 dat和bin文件。什么时候使用这个看需要了。都可以。
wen_eric 2016-08-15
  • 打赏
  • 举报
回复
//二进制写入到文件 #include <stdio.h> int main () { FILE * pFile; char buffer[] = { 'x' , 'y' , 'z' }; pFile = fopen ("myfile.bin", "wb"); fwrite (buffer , sizeof(char), sizeof(buffer), pFile); fclose (pFile); return 0; }
暗黑帝国 2016-08-15
  • 打赏
  • 举报
回复
一般来说字符串2者区别不大,如a二进制和文本方式都是ascii,如果数字就不同了如果要存放111这个32位整数,二进制在内存中就是0x0001F,所以二进制文件就按照内存中存放方式写入文件;但是如果用文本方式111就用0x31 0x31 0x31保存了。
cocoabird 2016-08-15
  • 打赏
  • 举报
回复
linux下一切皆文件
暗黑帝国 2016-08-15
  • 打赏
  • 举报
回复
//使用二进制写入 void write_to_binary_file() { struct Student stdu; stdu.num = 111; sprintf_s(stdu.name,20,"%s","shine"); stdu.score = 80.0f; fstream binary_file("test1.dat",ios::out|ios::binary|ios::app); //此处省略文件是否打开失败的判断 binary_file.write((char *)&stdu,sizeof(struct Student));//二进制写入的方式 binary_file.close(); } //文本格式写入 void write_to_text_file() { struct Student stdu; stdu.num = 111; sprintf_s(stdu.name,20,"%s","shine"); stdu.score = 80.0f; FILE *fp = fopen("test2.dat","a+"); //此处省略文件是否打开失败的判断 fprintf(fp,"%d%s%f",stdu.num,stdu.name,stdu.score); //将数据转换成字符串(字符串的格式可以自己定义) fclose(fp); }

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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