如何正确地将数据从二进制文件写入新的char数组。 我知道这个问题在这里被多次询问过,但我仍然无法弄清楚如何正确地做到这一点。
这就是我到目前为止......
struct Computer_Details {
char computer_type[99];
int release_year;
float price;
};
Computer_Details pc_details;
cout << "Enter Computer Type: ";
cin.getline(pc_details.computer_type, 255);
cout << "Enter Computer Release Date: ";
cin >> pc_details.release_year;
cout << "Enter Computer Price: ";
cin >> pc_details.price;
cout << "\n\n";
//Create File
ofstream file;
file.open("PC_Database.data", ios::binary | ios::app);
if (!file) cout << "Couldn't open file\n";
else {
file.write((char*)&pc_details, sizeof(Computer_Details));
file.close();
}
ifstream readFile;
readFile.open("PC_Database.data", ios::binary);
if (!readFile) cout << "Couldn't Open File\n";
else {
readFile.seekg(0, ios::end);
int fileSize = readFile.tellg();
int pcCount = fileSize / sizeof(Computer_Details);
readFile.seekg(0, ios::beg);
Computer_Details *pc_details = new Computer_Details[pcCount];
readFile.read((char*)pc_details, pcCount * sizeof(Computer_Details));
char *buff = new char[299];
for (int i = 0; i < pcCount; i++)
{
//write to buff char
}
readFile.close();
}
答案 0 :(得分:0)
尝试
std::ifstream input(szFileName, std::ios::binary);
data = std::vector<char>(std::istreambuf_iterator<char>(input),
(std::istreambuf_iterator<char>()));
char* charArray = &data[0];
size_t arraySize = data.size();
data
向量的缓冲区是所需的char数组。它的构造函数的参数是两个迭代器。第一个是ifstream
中的当前阅读位置(在这种情况下是流的开始)。第二个构造函数是默认值,它被视为结束迭代器。
答案 1 :(得分:0)
可能问题是你的结构大小, 检查结构的大小并将其与此结构的大小进行比较:
struct Computer_Details {
char computer_type[100];
int release_year;
float price;
};
同样的问题是当您尝试读取/写入包含两个其他类型(如int)之间的bool变量的结构时。
试试这个:
readFile.read((char*)pc_details->computer_type, sizeof(Computer_Details::computer_type));
readFile.read((char*)pc_details->release_year, sizeof(Computer_Details::release_year));
readFile.read((char*)pc_details->price, sizeof(Computer_Details::price));
编辑:查看此评论中的示例:https://stackoverflow.com/a/119128/7981164
答案 2 :(得分:0)
我的猜测是你想将pc_details推送到buff中,这样你就可以将它发送到某个地方并重建数据。
如果是这种情况,你可以这样做:
for( int i=0; i < pcCount; i++ )
{
memcpy( buff, (char*)pc_details, sizeof(computer_details));
buff += sizeof(computer_details);
pc_details++;
}
然而,在这样做时,你必须注意对齐并提供 因此填充。你的代码应该检查你的数组边界。