用C++写的二进制文件,用JAVA怎么读取?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C++写的二进制文件,用JAVA怎么读取?相关的知识,希望对你有一定的参考价值。

有两个变量 :int a =10; long b = 1000000l;

用C++ 将 a,b的值同时以字节形式依次写入文件,此时a占2个字节,b占4个字节;

请问用JAVA怎么读取该文件才能正确取得a,b的值?主要因为JAVA,C++中a,b占的字节大小不一样,该怎么处理?

用FileInputStream读取文件,然后BufferedInputStream来装流,最后用read方法读出字节数组用<<位移运算组合轻松完成你要的变量读取,short2字节,int4字节,long 8字节,相信你应该知道怎么做了,记得文件中的存储的字节是高低位反向的 参考技术A java 读二进制的dateInputStream,dateOutputStream这2个输入流。其实你多看看api就可以了 参考技术B short在java里是2字节,int是4字节,所以分别读一个short和int就可以了,读取二进制文件用DataInputStream

C++ 用二进制文件读/写对象

【中文标题】C++ 用二进制文件读/写对象【英文标题】:C++ reading/writing objects with binary files 【发布时间】:2014-06-20 22:16:02 【问题描述】:

我花了好几个小时试图解决二进制文件操作的问题。

任务是从二进制文件读取和写入 BookStoreBook 对象

BookStoreBook 类包含以下成员变量:

string isbn;
string title;
Author author;
string publisher;
Date dateAdded;
int quantityOnHand;
double wholesaleCost;
double retailPrice;

看书的代码如图:

fstream file("inventory.txt", ios::binary | ios::in | ios::out);    
vector<BookStoreBook> books:
BookStoreBook *book = (BookStoreBook *)new char[sizeof(BookStoreBook)];
file.read((char*)book, sizeof(BookStoreBook));
while (!file.eof())

     books.push_back(*book);
     file.read((char*)book, sizeof(BookStoreBook));

写书的代码如图:

vector<BookStoreBook> writeBooks = library.getBooks(); //library contains books
file.close();
file.open("inventory.txt", ios::out | ios::binary);

for(int i = 0; i < writeBooks.size(); i++)

     BookStoreBook *book = (BookStoreBook *)new char[sizeof(BookStoreBook)];
     book = &writeBooks[i];
     file.write((char*)book, sizeof(BookStoreBook));
     file.clear();

file.clear();
file.close();

我不想将任何字符串转换为 c_str(),因为这在分配要求中是被禁止的。

一些注意事项:

当我运行程序时,程序会尝试从文件中读取书籍,并且 那是当我们得到一个 Windows 错误窗口时,稍后当我调试时,我得到以下消息: FinalProject.exe 中 0x56b3caa4 (msvcr100d.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0x0084ef10

有趣的是,有时程序运行得很好,而且 有时它在第一次从文件中读取书籍时会崩溃。

但是,只要程序成功读取了某些内容,并且 我不修改书籍,然后重新打开程序,程序保持 完美运行。

似乎没有任何效果。请帮忙!

【问题讨论】:

你想在调试器中运行你的程序。 当您的方法序列化指针时,您将序列化指针本身,而不是指向的内容。这就是这里发生的事情,如果 string 意味着 std::string 实际上,我通过 Visual Studio 调试器收到了该错误消息 Author 和 Date 的类是什么样的? BookStoreBook 不是 POD,因为它继承了一个包含虚函数的类,并且有一个构造函数 【参考方案1】:

您的问题是BookStoreBook 类的某些部分包含指针,即使它们不可见。例如,std::string 有一个指向保存字符串内容的内存位置的指针。

几乎总是认为将 C++ 中的数据结构在内存中出现时写入磁盘是一种不好的做法。这样做并没有考虑到不同机器的字节顺序不同、不同机器上的字宽(intlong 在 32 位和 64 位机器上的大小可能不同),并且您会遇到所有指针问题。

您应该将BookStoreBook 的每个字段推送到输出流,按照

file << book.isbn << ' ';
file << book.title << ' ';
...

请注意,上述做法非常糟糕,因为解码变得非常困难。我建议您为此使用Boost.Serialization,或者编写自己的方法来从文件中读取/写入键值对,或者您可能想要查看jsoncpp 或tinyxml2。整个主题可能会变得非常复杂,因此坚持使用 Boost 是一个好主意,即使只是想弄清楚如何自己解决问题(假设这是家庭作业)。

【讨论】:

以上是关于用C++写的二进制文件,用JAVA怎么读取?的主要内容,如果未能解决你的问题,请参考以下文章

.class是啥文件啊?

class文件用啥软件打开 后缀名class是啥格式文件

怎样用Java读写二进制文件

python读取C#写的二进制文件,byte类型unpack

如何用C或c++写一段代码读取xsd结构生成一个XML文件,现在我有数据文件和XSD文件

C++ 用二进制文件读/写对象