【发布时间】:2012-04-15 14:30:05
【问题描述】:
例如在 C 中我有结构:
typedef struct {
int number;
double x1;
double y1;
double x2;
double y2;
double x3;
double y3;
} CTRstruct;`
然后我将它写入文件fwrite(&tr, 1, sizeof(tr), fp);(tr - 它的 CTRstruct var,fp - 文件指针);
那我需要用Java来阅读它!我真的不知道如何从文件中读取结构...我尝试用ObjectInputStream() 读取它,最后一个想法是用RandomAccessFile() 读取但我也不知道如何...(readLong(), readDouble()也不起作用,它可以正常工作,但不能读取正确的数据)。那么,知道如何使用 Java 从二进制文件中读取 C 结构吗?
如果有趣的话,我的读整数版本(但它很难看,我不知道如何处理double):
公共类 MyDataInputStream 扩展 DataInputStream{
public MyDataInputStream(InputStream AIs) {
super(AIs);
}
public int readInt1() throws IOException{
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();
return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0));
}
使用 double 我们可以以相同的方式处理(例如使用 int 或使用 long (8bytes),然后使用本机 func 转换为 double)。
【问题讨论】:
-
你写struct到file的方式不对,看看这个:stackoverflow.com/questions/10153155/…
-
真正正确的答案是不要将结构的内存表示转储到这样的文件中。
-
是的,mb这样做很愚蠢,但我需要这样做..(我的意思是在文件中写入孔结构)
-
您确实将文件打开为二进制文件? IE。
fp = fopen("some/file", "wb");?然后你必须注意诸如填充和Java如何处理endianess的整数,以及double是否是相同的格式。 -
@Daunn 好吧,因为在所有情况下都没有答案能够提供“正确”的答案,所以最简单的解决方案就是读取全零。当然,这几乎总是错误的——但这至少比每 100 次错误要好。使调试大大更简单