IDL/C 二进制数据的读取和写入
来源:互联网 发布:windows develop 编辑:程序博客网 时间:2024/05/15 05:38
IDL把一个数组写入一个二进制文件,sample
filename="/home/allen/sample"openw,1,filename,/F77_UNFORMATTEDa=[1L,3L,5L,7L,9L,11L,19L] ;IDL中的Long就是C语言中32位的int(64位机器上至少是这样)writeu,1,a ;36 byte = 4 byte * 9, 如果没有F77_UNFORMATTED关键字则是28 byteclose,1end
IDL读取一个二进制文件,sample
filename="/home/allen/sample"openr,2,filename,/F77_UNFORMATTED a=lonarr(7)readu,2,aprint,aclose,2end
用C读取该二进制文件并输出
#include<stdio.h>int main(){ FILE *fd; int integer[10],flag,i; if(fd=fopen("sample","rb")) { flag=fread(integer,sizeof(int),9,fd); } for(i=0;i<flag;i++) { printf("%d\n",integer[i]); } return 0;}
allen@xps:~$ ./read_binary
28
1
3
5
7
9
11
19
28
从这个输出结果中可以看到, 这里IDL采用的写入二进制文件的方法会自动在两端
保存数据的总长度, 长度计算公式为28
改进上面的C代码以便正确利用校验值:
#include<stdio.h>int main(){ FILE *fd; int integer[7],flag,i,dummy0,dummy1; if(fd=fopen("sample","rb")) { fread(&dummy0,sizeof(int),1,fd); //如果读取较多,可考虑将这句和下下句改成宏 flag= fread(integer,sizeof(int),7,fd); fread(&dummy1,sizeof(int),1,fd); } if(dummy0!=flag*4 || dummy1!=flag*4) { puts("read error, exit!"); return -1; } for(i=0;i<flag;i++) { printf("%d\n",integer[i]); } fclose(fd); return 0;}
//用C语言写入二进制数据可以用函数fwrite,用法和fread相似.//size_t 就是 unsigned intsize_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
作为对比, 以下是IDL普通ASCII文件的读写
;writefilename="/home/allen/sample-ascii"openw,1,filenamea=[1L,3L,5L,7L,9L,11L,19L]printf,1,aclose,1end
;readfilename="/home/allen/sample-ascii"openr,2,filenamea=lonarr(7)readf,2,aprint,aclose,2end
作为对比, 以下是没有f77_unformatted
关键字的IDL二进制输入/输出时, C代码修改后应该的样子(其实这样子更方便, 只是没有了对fortran的兼容性和一点点安全性, 但是我不在乎!)
#include<stdio.h>int main(){ FILE *fd; int integer[7],flag,i; if(fd=fopen("sample","rb")) { flag= fread(integer,sizeof(int),7,fd); } for(i=0;i<flag;i++) { printf("%d\n",integer[i]); } fclose(fd); return 0;}
延伸阅读
IDL读写F77_UNFORMATTED文件的一个特点
0 0
- IDL/C 二进制数据的读取和写入
- Java 读取 C++写入的二进制数据
- Oracle中如何读取和写入二进制数据
- JavaOOP二进制的读取写入
- IDL和MATLAB读取grib数据
- JavaOOP IO 带二进制 的 读取和写入方法
- 磁盘扇区数据的读取和写入
- 联系人数据的读取和写入
- SQLite数据库的数据读取和写入
- ASP.Net 照片数据(二进制数据)读取和写入简单举例
- c语言创建写入和读取TXT文件数据
- c语言创建写入和读取TXT文件数据
- 第十七章,txt文件的写入和读取数据结合练习(C++)
- json读取和写入数据
- R数据读取和写入
- php操作XML,读取数据和写入数据的方法
- qt数据写入文件和读取文件里的数据
- php操作XML,读取数据和写入数据的方法
- 内核中一些宏操作的定义
- 关于MVC4.0 WebAPI上传图片重命名以及图文结合
- OpenCV坐标体系的初步认识
- Android Adapter回调接口
- Intent 详解(转)
- IDL/C 二进制数据的读取和写入
- javascript内存泄露
- OpenGL编程逐步深入(四)Shaders
- 网络术语MSL/TTL/RTT
- 成功云企业遵循的十项最佳实践
- java执行JavaScript脚本
- c++多线程编程
- 表单校验
- java中\r与\n的区别 (主要是在windows中DOS命令下)