文件读写

文件读写

<字节对齐与大小端>
(1)对于大小端转换,可以使用以下函数:
 

1 //对应int32大小的成员 的转换 范例 
2 int swapInt32(int value)
3 {
4     return ((value & 0x000000FF) << 24) |
5         ((value & 0x0000FF00) << 8) |
6         ((value & 0x00FF0000) >> 8) |
7         ((value & 0xFF000000) >> 24);
8 }

(2)字节对齐:
 

#pragma pack(push) //保存对齐状态 
#pragma pack(1)//设定为1字节对齐 
struct newTest{    
    char bParam;
    int aParam;
};
#pragma pack(pop)//恢复对齐状态 

 

对比python,其字节对齐和大小端的设置,都可以通过ctypes库实现
1 class chooseStructure(ct.LittleEndianStructure):#小端结构体
2 _pack_ = 1 #字节对齐
3 _fields_ = [
4 ("chooseFre",ct.c_float*4)
5 ]

 

一、C语言对文件读写的支持
写入二进制文件:
1 int a = 10;
2 FILE *pFile = fopen("1.dat","wb");
3 fwrite(&a,sizeof(int),1,pFile);
4 fclose(pFile);

读取二进制文件:
1 newTest ntest;//为上面定义的结构体
2 pFile = fopen("1.dat", "rb");
3 fread(&ntest,sizeof(newTest),1,pFile);
4 fclose(pFile);

 

注意:文件读写,对于二进制文件的读写,一定要使用rb/wb/ab/rb+/wb+/ab+!
和文本文件区分开来!
 
如果不使用fclose,数据先存到缓冲区里面,不能立即存到磁盘文件中,但是如果fclsoe之后,如果再想操作文件,需要重新fopen,所以,可以使用另一个C函数:fflush。该函数作用是将缓冲区中的数据写到磁盘文件中。
fflush适用于不断读写文件的情况,而每次新的读写,如果需要指定写入文件的位置,需要使用函数fseek。
例子:
1 FILE *pFile = fopen("1.txt", "w+");
2 char buf[22] = "asdf";
3 fwrite(buf,1,22,pFile);
4 fflush(pFile);
5 fseek(pFile,0,SEEK_SET);//一定要调整文件指针的位置
6 char ch[100];
7 fread(ch,1,100,pFile);
8 fclose(pFile);
9 cout << ch;

 

如上为正确的读写过程,需要注意的地方:
(1) w+和r+都为可读可写,但是r+读的时候如果没有该文件就会报错
(2) 从缓冲区写到磁盘文件后,要通过fseek调整文件指针到第一个位置,才能保证后面读的时候从头读
 
但是上面的方法存在的问题是:有时候不知道文件大小,字符数组的大小需要灵活设置。
 

 1 FILE *pFile = fopen("1.txt", "r");
 2 char *pBuf;
 3 fseek(pFile,0,SEEK_END);
 4 //ftell文件位置指针当前位置相对于文件首的偏移字节数
 5 long len = ftell(pFile);
 6 pBuf = new char[len+1];
 7 rewind(pFile);
 8 fread(pBuf,1,len,pFile);    
 9 pBuf[len] = 0;
10 fclose(pFile);
11 cout << pBuf;

 

至于说出现乱码,首先,写入字符串的时候,因为要由\0这样一位作为结束符,所以,定义数组长度的时候,要多一位,fwrite的长度也要保留出那一位结束字符!!!或者使用strlen(“xxxx”)+1
 
—————————
python调用c接口,实现对二进制文件操作
对于python来说,其内置函数open()/file()可以对文件进行操作。
但是由于对于弱类型的python语言来说,其没有int、char、short等不同字节存储的支持,并且读取文件read()函数,返回str类型的数据。
所以想要像c/c++那样操作二进制文件数据,对于python来说,会有一些麻烦。操作方法有很多,其中包括:
(1)struct模块
通常使用python中的第三方库struct函数,来对读取的str类型进行转换
譬如:
写入:
1 import ctypes as ct
2 num = ct.c_int32(12)
3 f = open("1.dat","wb")
4 f.write(num)
5 f.close()

 

解析:
1 import struct
2 f = open("1.dat","rb")
3 s = f.read()
4 f.close()
5 i = struct.unpack('i',s)
6 print i

 

其中,写入文件为‘\x0C\x00\x00\x00’
解析后的i为(12,)(返回一个元组)
(2)ctypes模块
利用内存操作
1 t = ct.c_int32() 2 ct.memmove(ct.byref(t),s,len(s)) 3 print t 
解析后得到t为 ct.c_long(12)
 
所以,通过python读取二进制文件的时候,需要进一步操作,才能得到int、char、short等,以及其他结构的数据。
 
—————————
 

二、利用C++对文件读写的支持

写入文件用ofstream函数
读取文件使用ifstream函数
利用C++操作文件场合比较少,这里不再研究
 

 

 
 
 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119501.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot入门(个人总结)

    @纯属个人学习总结,不喜勿喷哈。(学习来自慕课网)我觉得学习SpringBoot需要具备的前置知识熟悉maven构建项目;懂得Spring注解开发的知识;了解restful API的理论知识(http://www.ruanyifeng.com/blog/2011/09/restful.html)一、SpringBoot介绍我们在做java的项目中经常被xml的配置搞得头大…

    2021年11月30日
    52
  • 邮件群发怎么设置_qq邮箱邮件怎么群发

    邮件群发怎么设置_qq邮箱邮件怎么群发大家都说30岁的女人一枝花,但是我就狠狠的被家里人催婚了。老妈让我去参加一个相亲,虽然心里不想去,但是为了让老妈开心,还是去参加了这场相亲局。当相亲那天来临时,我进入了跟人约好的咖啡馆,见面时寒暄了几句,就进入了无声的沉默,后来我们聊天时提起了我们的职业,我说我是外企HR,他跟我说他是会展公司的市场部部员,然后我问他工作具体是干什么的,然后他跟我说他是具体用邮件来开发客户,介绍会展公司承包的展览这种工作。我说好厉害的样子,你们是不是也需要邮件群发啊?最近我的邮箱有限,不是特别好用,刚好想换一个邮箱,你平常使

    2025年6月26日
    5
  • 分布式缓存之memcached–命令测试

    1.启动Memcache常用参数2.基本命令五种基本memcached命令执行最简单的操作。这些命令和操作包括:前三个命令是用于操作存储在memcached中的键值对的标准修改命令。

    2021年12月28日
    35
  • Pytest(6)重复运行用例pytest-repeat[通俗易懂]

    Pytest(6)重复运行用例pytest-repeat[通俗易懂]前言平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,

    2022年7月29日
    8
  • Idea激活码最新教程2022.1.2版本,永久有效激活码,亲测可用,记得收藏

    Idea激活码最新教程2022.1.2版本,永久有效激活码,亲测可用,记得收藏Idea 激活码教程永久有效 2022 1 2 激活码教程 Windows 版永久激活 持续更新 Idea 激活码 2022 1 2 成功激活

    2025年5月25日
    3
  • html中的空格怎么写,html中空格代码是什么?(总结)

    html中的空格怎么写,html中空格代码是什么?(总结)首页>web前端>html教程>正文HTML中空格代码是什么?(总结)原创2018-08-对于新手小白来说,html空格符号代码的书写可能有点茫然,那么本篇文章就给大家总结介绍关于html空格代码的多种表示方法。希望对大家有一定的帮助。HTML提供了6种空格(),它们拥有不同的宽度。一、nbsp;非断行空格,是常规空格的宽度,可运行于所有主流浏览器。其它几种空格(ensp;、em…

    2022年6月21日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号