随机字符存储在文件中

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。其余为字符串,因此 adminNameadminPhone 应该是在记事本中以“自然语言”显示为字符串(正式)。

这就是它在文件中的样子(假定 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 或新行或其他),或者写入文件的固定长度。