我正在为我的学校项目编写一个包含大量二进制文件的c ++程序。我的问题是,只要编译器遇到一个write语句(我的意思是使用fstream :: write将数据从类的对象写入二进制文件),执行就会停止,我会收到异常终止消息。我确定'write'语句是问题,因为它之前的每个语句都被执行,而下一个语句却没有。当我使用fwrite时问题似乎已经解决,但后来我发现数据实际上并没有被写入文件。我试过在另一个函数或使用'this'指针的方法中将对象写入文件,但计算机似乎不接受任何一个。
该计划在几天前工作得很好,但似乎突然之间,它已经停止工作了。我无法附加源代码,因为问题在整个程序中传播,该程序长达5000多行。但是,这里有一个导致问题的样本:
bottle b; //bottle is a class
fstream file ("Bottle.dat",ios::out|ios::binary);
file.write ((char*)&b,sizeof(b));
作为替代,我也试过
FILE*fptr=fopen ("Bottle.dat","w");
fwrite (&b, sizeof(b), 1, fptr);
前者导致异常终止,后者不起作用。编译期间没有错误消息。有谁能够帮我?我是编程的新手(虽然还在高中),所以请尽量保持简单。谢谢!
编辑:也许这可以作为更好的例子。
class irrigation
{ int n,i,itime[20],t[20];
float amt[20],water[20];
protected:
float irr;
public:
float getirr()
{ return irr;
}
void irrigate();
};
void irrigate_calc()
{ fstream file ("Irrigate.dat",ios::in|ios::binary);
irrigation i;
file.read ((char*)&i,sizeof(i));
file.close();
i.irrigate();
fstream file1 ("Irrigate.dat",ios::out|ios::binary);
file1.write ((char*)&i,sizeof(i));
file1.close();
}
据我所知,当我打开一个文件进行阅读,再次关闭然后打开它进行写入时,会出现问题。当然,我确实尝试直接在ios :: in,ios :: out和ios :: ate模式下打开文件,但这很麻烦,很长时间。
编辑2:同一个程序面临的另一个问题是,一些正常的cout语句间歇性地喷出垃圾:许多特殊字符和其他完全不相关的cout语句中的一小部分。这种情况有什么特别的原因吗?答案 0 :(得分:1)
由于您的对象不是POD
,因此您可以尝试写出其所有成员。例如,
#include <fstream>
using namespace std;
class B
{
public:
// Simple constructor
B(int mem1, char mem2) : member1(mem1), member2(mem2) {}
// Have some methods here
bool write() const {
fstream file("Bottle.dat", ios::out|ios::binary);
if(!file.is_open())
return false;
file.write(reinterpret_cast<const char*>(&member1), sizeof(int));
file.write(&member2, sizeof(char));
file.close();
return true;
}
private:
int member1;
char member2;
};
int main()
{
B sample(52, 'c');
sample.write();
return 0;
}
现在您可以致电yourobj.write()
,它可以写出Bottle.dat
。您可以随意写出/编码您的数据。但这是一个简单的直接输出。您的前4个字节(好,sizeof(int)
字节)将为member1
,您的下一个字节为member2
。因此,如果您愿意,也可以轻松阅读此格式。
修改强>
我已更新了我的代码,使其成为可编辑的示例。您可以使用十六进制编辑器观察输出文件,以验证一切正确。您应该能够(在任何编辑器中)能够看到与char
对应的member2
('c')。如果在十六进制编辑器中打开它,您将看到前4个字节等于数字0x34
。根据机器的字节顺序,它可能看起来像00000034
或34000000
这是十进制52
,这是我们根据示例代码所期望的。