为什么我在读取二进制文件时得到垃圾值?
Why am i Getting garbage value when reading a binary file?
为了简单起见,我写了一个简单的代码来重现我的问题。正如您在代码中看到的那样,我创建了一个包含两个成员的结构,然后创建了结构类型的数组,然后对其进行了初始化 student newStudent[3] ={{"joseph",20}, {"yonas",30},{"miryam",40}};
。我将结构中的所有信息存储到一个二进制文件 newFile.write(reinterpret_cast<char*>(newStudent), 3 * sizeof(student));
(直到这里一切都很好)然后我创建了另一个数组 student loadedStudent[3];
来加载二进制文件中的所有数据并输出加载的数据使用 for 循环 cout<<"Name: "<<loadedStudent[i].name<<"Age: "<<loadedStudent[i].age<<endl;
。问题是我存储的数据是 joseph",20, "yonas",30,"miryam",40
但程序正在输出垃圾值 Name: 8H???Age: 1 Name: J???Age: 1 Name: ?I???Age: 32766
。
这是为什么?
#include <iostream>
#include <fstream>
using namespace std;
struct student{
char name[10];
int age;
};
int main()
{
student newStudent[3] ={{"joseph",20}, {"yonas",30},{"miryam",40}};
fstream newFile;
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);
//for(int i = 0; i<3; i++){
//cout<<"Name: "<<newStudent[i].name<<" Age: "<<newStudent[i].age<<endl;
//}
if(newFile.is_open()){
newFile.write(reinterpret_cast<char*>(newStudent), 3 * sizeof(student));
}else cout<<"faild to open file";
student loadedStudent[3];
newFile.seekg(0, ios::beg);
if(newFile.is_open()){
newFile.read(reinterpret_cast<char*>(loadedStudent), 3 * sizeof(student));
newFile.close();
}else cout<<"faild to open file";
for(int i = 0; i<3; i++){
cout<<"Name: "<<loadedStudent[i].name<<"Age: "<<loadedStudent[i].age<<endl;
}
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);
打开文件仅供输出。您需要 ios::in | ios::out
才能读写。
当您打开文件时,您只是将其作为输出打开 ios::out
您还应该包括 ios::in
以便您可以访问该文件。现在您正在打印未初始化数组的不确定值。
改变这个
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);
进入
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::in | ios::binary);
为了简单起见,我写了一个简单的代码来重现我的问题。正如您在代码中看到的那样,我创建了一个包含两个成员的结构,然后创建了结构类型的数组,然后对其进行了初始化 student newStudent[3] ={{"joseph",20}, {"yonas",30},{"miryam",40}};
。我将结构中的所有信息存储到一个二进制文件 newFile.write(reinterpret_cast<char*>(newStudent), 3 * sizeof(student));
(直到这里一切都很好)然后我创建了另一个数组 student loadedStudent[3];
来加载二进制文件中的所有数据并输出加载的数据使用 for 循环 cout<<"Name: "<<loadedStudent[i].name<<"Age: "<<loadedStudent[i].age<<endl;
。问题是我存储的数据是 joseph",20, "yonas",30,"miryam",40
但程序正在输出垃圾值 Name: 8H???Age: 1 Name: J???Age: 1 Name: ?I???Age: 32766
。
这是为什么?
#include <iostream>
#include <fstream>
using namespace std;
struct student{
char name[10];
int age;
};
int main()
{
student newStudent[3] ={{"joseph",20}, {"yonas",30},{"miryam",40}};
fstream newFile;
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);
//for(int i = 0; i<3; i++){
//cout<<"Name: "<<newStudent[i].name<<" Age: "<<newStudent[i].age<<endl;
//}
if(newFile.is_open()){
newFile.write(reinterpret_cast<char*>(newStudent), 3 * sizeof(student));
}else cout<<"faild to open file";
student loadedStudent[3];
newFile.seekg(0, ios::beg);
if(newFile.is_open()){
newFile.read(reinterpret_cast<char*>(loadedStudent), 3 * sizeof(student));
newFile.close();
}else cout<<"faild to open file";
for(int i = 0; i<3; i++){
cout<<"Name: "<<loadedStudent[i].name<<"Age: "<<loadedStudent[i].age<<endl;
}
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);
打开文件仅供输出。您需要 ios::in | ios::out
才能读写。
当您打开文件时,您只是将其作为输出打开 ios::out
您还应该包括 ios::in
以便您可以访问该文件。现在您正在打印未初始化数组的不确定值。
改变这个
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);
进入
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::in | ios::binary);