Saya menyimpan data tabel saya dalam file dengan pola tertentu. Saya akan melakukannya dengan x86 dan membacanya dengan pola yang sama. Itu benar.

Tetapi jika kompiler perubahan ke x64 saya tidak dapat membaca data dari file karena ukuran alokasi std::string berubah.

Dalam versi x86:

printf("string size: %d\n", sizeof(std::string)); // output is "string size: 28"

Dalam versi x64:

printf("string size: %d\n", sizeof(std::string)); // output is "string size: 40"

Ketika mode kompilasi adalah x64, saya tidak dapat membaca data yang benar dari file karena ukuran variabel berubah.

Apakah ada cara untuk mengubah ukuran string default? jika saya mengaturnya 28 di kedua mode kompilasi. Itu sudah cukup bagiku.

Catatan

Saya tidak menggunakan sizeof sebagai panjang saya menggunakannya untuk memverifikasi data struct

typedef struct _USER_TABLE
{
    uint32_t ID;        
    string name;
    uint16_t age;
}



    DWORD dwNum;
    size_t i, j, iDataTypeCount = 0;
    ReadFile(hFile, &iDataTypeCount, 4, &dwNum, NULL);

    std::vector<int> offsets;
    if (iDataTypeCount > 0)
    {
        m_DataTypes.insert(m_DataTypes.begin(), iDataTypeCount, DT_NONE);
        ReadFile(hFile, &(m_DataTypes[0]), sizeof(DATA_TYPE) * iDataTypeCount, &dwNum, NULL);

        if (FALSE == MakeOffsetTable(offsets))
        {
            __ASSERT(0, "can't make offset table");
            return FALSE;
        }
        size_t iSize = offsets[iDataTypeCount];

        if (sizeof(Type) != iSize || DT_DWORD != m_DataTypes[0])
        {
            m_DataTypes.clear();
            printf("Data Type is mismatch or size is incorrect\n");
            return FALSE;
        }
    }

Saya menggunakan sizeof(_USER_TABLE) untuk memverifikasi dan ukuran struktur berubah tergantung pada mode kompilasi. Karena ukuran string berubah

-3
seukaiwokeo 30 Juni 2020, 19:08

1 menjawab

Jawaban Terbaik

Tidak ada cara untuk mengubah ukuran kelas std::string. Juga tidak akan mengubah ukuran std::string atau bahkan mengetahui ukuran itu berguna dalam menyimpan data dalam file karena std::string tidak mudah disalin.

Anda perlu melakukan serialisasi yang tepat. Salah satu pendekatan sederhana adalah dengan menyimpan konten buffer yang dikelola std::string, dan mengandalkan terminator nol untuk menentukan panjang data tertulis.


P.S. _USER_TABLE, __ASSERT: Pengidentifikasi ini dicadangkan untuk implementasi bahasa. Anda harus menggunakan nama lain untuk kelas tersebut, dan pernyataan dengan asumsi Anda telah mendefinisikannya sendiri.

2
eerorika 30 Juni 2020, 16:37