随机字符存储在文件中
Random Characters being stored in a file
我创建了一个 Admins
class,其中包含三个数据成员 (adminID, adminName, adminPhone)
和相同 class 的对象数组。每个对象的数据将存储在一个 .txt
文件中。
没有 运行-time 错误,程序按预期运行,但是在记事本中打开文件时,我发现文件中有随机字符。
这是 class 声明:
class Admins
{
private:
int adminID;
char adminName[100];
char adminPhone[11];
public:
Admins()
{
adminID = 0;
strcpy(adminName, "NULL");
strcpy(adminPhone, "NULL");
}
void addAdminData();
void writeAdminData();
void readAdminData();
};
这是写入数据的片段:
void Admins::writeAdminData()
{
if(adminID == 0)
cout<<"Admin Data not initialized";
else
{
ofstream fout;
fout.open("AdminData.txt", ios::app);
fout.write((char*)this, sizeof(*this));
fout.close();
}
}
文件是这样的:
Aryan Soni šÐo ÿÿÿÿ šÐo ÿÿÿÿ @@ € ¶@ ØNr 583963728
概念
这些不是随机字符,而是存储在 stack-memory 上的 class 的原始字节,用于单个实例,并且在应用程序的另一个实例中将完全随机。简而言之,那些“随机”字符是超出字符串中空终止 ('[=12=]'
) 字符的垃圾字节。
修复
fout.write((char*)this, sizeof(*this));
将上面一行改为下面一行:
fout << this->adminID << this->adminName << this->adminPhone;
您可以格式化数据以便再次读取和解析它。
您将 adminID
声明为 int,因此它将以二进制形式写入,可能是 0x00000001,假设管理员的 ID 为 1。其余为字符串,因此 adminName
、adminPhone
应该是在记事本中以“自然语言”显示为字符串(正式)。
这就是它在文件中的样子(假定 int 为 32 位):
00000000 01 00 00 00 61 64 6d 69 6e 35 35 35 31 32 33 34 |....admin5551234|
00000010 35 |5|
00000011
它还有更多问题。文件中的字符串没有终止,因此尝试读取它的人只能知道 int 的大小(4 个字节),其余的将是字符串,无法区分名称。这些名称应该以某种方式终止(使用 0x00 或新行或其他),或者写入文件的固定长度。
我创建了一个 Admins
class,其中包含三个数据成员 (adminID, adminName, adminPhone)
和相同 class 的对象数组。每个对象的数据将存储在一个 .txt
文件中。
没有 运行-time 错误,程序按预期运行,但是在记事本中打开文件时,我发现文件中有随机字符。
这是 class 声明:
class Admins
{
private:
int adminID;
char adminName[100];
char adminPhone[11];
public:
Admins()
{
adminID = 0;
strcpy(adminName, "NULL");
strcpy(adminPhone, "NULL");
}
void addAdminData();
void writeAdminData();
void readAdminData();
};
这是写入数据的片段:
void Admins::writeAdminData()
{
if(adminID == 0)
cout<<"Admin Data not initialized";
else
{
ofstream fout;
fout.open("AdminData.txt", ios::app);
fout.write((char*)this, sizeof(*this));
fout.close();
}
}
文件是这样的:
Aryan Soni šÐo ÿÿÿÿ šÐo ÿÿÿÿ @@ € ¶@ ØNr 583963728
概念
这些不是随机字符,而是存储在 stack-memory 上的 class 的原始字节,用于单个实例,并且在应用程序的另一个实例中将完全随机。简而言之,那些“随机”字符是超出字符串中空终止 ('[=12=]'
) 字符的垃圾字节。
修复
fout.write((char*)this, sizeof(*this));
将上面一行改为下面一行:
fout << this->adminID << this->adminName << this->adminPhone;
您可以格式化数据以便再次读取和解析它。
您将 adminID
声明为 int,因此它将以二进制形式写入,可能是 0x00000001,假设管理员的 ID 为 1。其余为字符串,因此 adminName
、adminPhone
应该是在记事本中以“自然语言”显示为字符串(正式)。
这就是它在文件中的样子(假定 int 为 32 位):
00000000 01 00 00 00 61 64 6d 69 6e 35 35 35 31 32 33 34 |....admin5551234|
00000010 35 |5|
00000011
它还有更多问题。文件中的字符串没有终止,因此尝试读取它的人只能知道 int 的大小(4 个字节),其余的将是字符串,无法区分名称。这些名称应该以某种方式终止(使用 0x00 或新行或其他),或者写入文件的固定长度。