【发布时间】:2019-03-28 17:38:09
【问题描述】:
我正在为 C++ 课程做一些功课,我被指示创建一个结构来保存 4 个公司部门的数据和每个季度的销售数据。我要将结构保存到二进制文件中,然后重新导入并读取数据。一切实际上都按预期运行,但是在输出后我得到一个 RUN FAILED, exit code 1 错误。
我最初认为这是由于某个地方的数组越界,但回头看代码我找不到它。
* Author: James Hartley
* Created on March 27, 2019, 10:09 PM
* Description: Gaddis Ch.12 Problem 11-12 Corporate Sales Data Output/Input
*/
#include <iostream>
#include <fstream>
using namespace std;
struct division {
string name;
int qtrSales[4];
};
void structToFile(string fileName, division* div, int arySize) {
fstream fileObject;
fileObject.open(fileName, ios::out | ios::binary);
fileObject.write(reinterpret_cast<char *>(div), sizeof(division) * arySize);
fileObject.close();
}
void fileToStruct(string fileName, division* div, int arySize) {
fstream fileObject;
fileObject.open(fileName, ios::in | ios::binary);
fileObject.read(reinterpret_cast<char *>(div), sizeof(division) * arySize);
fileObject.close();
}
int main(int argc, char** argv) {
division divs[4];
division divsImport[4];
divs[0].name = "East"; divs[1].name = "West"; divs[2].name = "North"; divs[3].name = "South";
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
cout << "Please enter Quarter " << j+1 << " sales for " << divs[i].name << " division" << endl;
cin >> divs[i].qtrSales[j];
}
}
structToFile("struct.dat", divs, 4);
fileToStruct("struct.dat", divsImport, 4);
for (int i = 0; i < 4; i++) {
cout << "Division: " << divsImport[i].name << endl;
for (int j = 0; j < 4; j++) {
cout << "Quarter: " << j+1 << endl;
cout << "Sales: " << divsImport[i].qtrSales[j] << endl;
}
}
return 0;
}
它输出正确,但是在输出后告诉我 RUN FAILED 退出代码 1。
【问题讨论】:
-
这可能会有所帮助:stackoverflow.com/questions/523872/…
-
fileObject.write(reinterpret_cast<char *>(div), sizeof(division) * arySize);-- 你应该意识到这永远行不通。sizeof()是一个编译时值,为您提供该类型所包含的字节数。所以sizeof(division)保持不变,不管std::string对象中有多少个字符。字符串中可能有一千个字符,sizeof(division)将保持不变。因此,无论您的std::string成员在其中有多少个字符,您都将(可能)向文件写入 40 字节左右的数据。 -
@PaulMcKenzie 谢谢你的详细回答,你很容易理解我做错了什么。感谢所有帮助。
标签: c++ file netbeans struct binary