这是我第一次尝试在C++中使用随机访问文件,虽然我之前在Java中也尝试过,但是我无法在C++中使它正常工作。我的想法是创建100个空记录,然后将一个记录存储在文件的特定记录号处。以下是我的代码,我尽可能地保持简单:
这里我有一个名为Tool的结构体:
struct Tool {
int number;
char name[20];
int quantity;
double cost;
};
这里是我的主函数内容:
fstream outFile;
outFile.open("inventory.dat");
// Create 100 empty tool records
Tool tool;
tool.number = 0;
tool.name[0] = '\0';
tool.quantity = 0;
tool.cost = 0;
for (int i = 0; i < 100; i++) {
outFile.write(reinterpret_cast<char *>(&tool.number), sizeof(int));
outFile.write(tool.name, sizeof(char)* 20);
outFile.write(reinterpret_cast<char *>(&tool.quantity), sizeof(int));
outFile.write(reinterpret_cast<char *>(&tool.cost), sizeof(double));
}
// Insert A tool record
Tool t;
t.number = 3;
t.quantity = 7;
t.cost = 57;
strcpy(tool.name, "Electric Sander");
outFile.seekp((tool.number - 1) * sizeof(Tool));
outFile.write(reinterpret_cast<char *>(&tool.number), sizeof(int));
outFile.write(tool.name, sizeof(char)* 20);
outFile.write(reinterpret_cast<char *>(&tool.quantity), sizeof(int));
outFile.write(reinterpret_cast<char *>(&tool.cost), sizeof(double));
outFile.close();
我初始化100个空记录的部分很好(假设我们要评论代码的插入部分)。
然而,当执行插入部分时,我的程序会生成4GB的数据。我不确定发生了什么。非常感谢任何形式的帮助。提前致谢。
seekp
操作使用sizeof(Tool)
,但写操作使用各个成员的大小。 - Thomas MatthewsoutFile.open("inventory.dat", std::ios::binary);
。 - Galikreinterpret_cast
,那么它是错误的,除非你能解释为什么它不是错误的。 - Neil Kirk