【发布时间】:2013-01-05 19:10:10
【问题描述】:
我正在为我的学校项目编写一个涉及大量二进制文件的 c++ 程序。我的问题是,每当编译器遇到写入语句(我的意思是使用 fstream::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 语句的一点点。发生这种情况有什么特殊原因吗?
【问题讨论】:
-
只有
bottle是 POD 类型时才有效。bottle是如何定义的? -
哦,真的吗? Bottle 绝对不是 POD:它具有私有和受保护的数据成员以及公共成员函数。那我就不能用fwrite了吗?
-
你可以,但你不会从中得到任何有意义的东西......虽然你不应该遇到崩溃
-
你能提供一个小而完整的例子来说明这个问题吗?
-
I can't attach the source code because <excuse>Always 表示您在调试期间没有创建 testcase,这意味着您不应该在这里询问。 :)
标签: c++ binaryfiles