问题描述
在Mac(因此为64位,小端)中, 我想读取在〜1989 SGI中创建的二进制数据文件 (Irix 3.x,680x0摩托罗拉CPU,因此是32位大端)。
该文件中的数据是使用C代码编写的:
fwrite(&buf_float,FLOATBYTEBUFSIZE,1,fp_outFile);
在Mac中,我应该使用哪个C代码读取数据?
在Xcode中,我尝试了下面的代码,该代码可以编译但在运行时失败:
#import <CoreFoundation/CoreFoundation.h>
CFSwappedFloat32 swappedFloat;
fread(&swappedFloat,sizeof(swappedFloat),ifp); // Error: "Thread 1: EXC_BAD_ACCESS (code=1,address=0x68)"
f = CFConvertFloat32SwappedToHost(swappedFloat);
main.c(最低工作代码):
#include <stdio.h>
#include <stdlib.h>
#import <CoreFoundation/CoreFoundation.h>
int main(int argc,const char * argv[]) {
FILE *ifp;
printf("\n Opening for reading binary file: %s...",argv[1]);
ifp = fopen(argv[1],"r");
printf("\n Reading 1st value float...");
CFSwappedFloat32 swappedFloat;
fread(&swappedFloat,ifp); //Thread 1: EXC_BAD_ACCESS (code=1,address=0x68)
float f = CFConvertFloat32SwappedToHost(swappedFloat);
printf("\n Read value %f",f);
fclose(ifp);
printf("\n DONE.\n");
return 0;
}
下载测试二进制数据文件“ inFile”(以及可选的最小Xcode项目): https://drive.google.com/drive/folders/1OatRzDrPak2KNRH5ZhrpjP4S3Z9Ps3jY
完整堆栈跟踪:
Opening for reading binary file: inFile...
Reading 1st value float...(lldb) bt
* thread #1,queue = 'com.apple.main-thread',stop reason = EXC_BAD_ACCESS (code=1,address=0x68)
frame #0: 0x00007fff6f3a5a5d libsystem_c.dylib`flockfile + 18
frame #1: 0x00007fff6f3a76ad libsystem_c.dylib`fread + 31
* frame #2: 0x0000000100003e3d MWE1`main(argc=2,argv=0x00007ffeefbff540) at main.c:35:5
frame #3: 0x00007fff6f31dcc9 libdyld.dylib`start + 1
(lldb)
解决方法
文件指针为空(感谢@kaylum的评论)。那是因为inFile的权限是错误的。我用“ chmod -R 777 ./”修复了它们。该程序现在在Terminal(与gcc一起编译)中运行,并读取float值。它们是否正确,取决于未来几天的3D可视化工作。再次感谢所有发表评论的人!