Ich habe eine benutzerdefinierte Klasse namens Array. Es speichert das Array vom Typ T und eine Ganzzahl.
Schaut dies richtig aus, wenn ein Array in einer Datei gespeichert wird?
fout.write((char *)m_array, sizeof(T) * m_size);
Wie ich es speichere:
bool save(const std::string &filename)
{
std::ofstream fout;
// Open the file.
fout.open(filename, std::ios::out | std::ios::binary);
// Validate that the file is open.
if (!fout.is_open())
return false;
// Write the size to file.
fout << m_size << std::endl;
fout.write((char *)m_array, sizeof(T) * m_size);
fout.close();
return true;
}
Ladefunktion:
bool load(const std::string &filename)
{
std::ifstream fin;
int size = 0;
// Open the file.
fin.open(filename, std::ios::in | std::ios::binary);
// Validate that the file is open.
if (!fin.is_open())
return false;
// Read the size from file.
fin >> size;
// Resize if needed
if (size != m_size)
resize(size);
fin.read((char *)m_array, sizeof(T) * m_size);
fin.close();
return true;
}
Die Hauptdatei:
Array<int> a(10);
a.clear(); // set all values to 0.
a[5] = 3;
if (a.save("test.dat"))
con.writeLine("Saved");
Dies ergibt die Ausgabewerte 0,0,0,0,0,0,3,0,0,0.
Verwenden Sie beim Abrufen Folgendes:
fin.read((char *)m_array, sizeof(T) * m_size);
Ich bekomme 10,0,0,0,0,768,0,0,0,0.
Was mache ich falsch? Der zweite Parameter sagt, er möchte die Anzahl, die für mich sizeof (T) * m_size wäre.
Update: Die Alternative ist dies beim Speichern:
for (int i = 0; i < m_size; i++)
fout << m_array[i] << std::endl;
Aber ich bevorzuge die erste Methode.
Sie mischen formatierte und unformatierte Schreibvorgänge in den Stream. Eher, als:
fout << m_size << std::endl;
Sie müssen tun:
fout.write(reinterpret_cast<char*>(&m_size), sizeof(m_size));
BEARBEITEN:
Nachdem Sie gesehen haben, dass Sie aktualisiert sind, müssen Sie lesen, nicht mit diesem:
fin >> size;
Aber damit:
fin.read(reinterpret_cast<char*>(&m_size), sizeof(m_size));
Daher sollte hier erwähnt werden, dass Sie das Rad neu erfinden. Solange Sie damit einverstanden sind ... Trotzdem halte ich es hier für angebracht, die Verwendung vorzuschlagen vector<T>
. Dies würde Ihren Code lesbarer, weniger fehleranfällig und möglicherweise schneller machen.
Vorausgesetzt, vector<int> a
Sie können schreiben, um so zu ofstream fout
mögen:
const auto a_size = size(a);
fout.write(reinterpret_cast<const char*>(&a_size), sizeof(a_size));
fout.write(reinterpret_cast<const char*>(data(a)), sizeof(decltype(a)::value_type) * a_size);
Gegeben ifstream fin
, Sie können so lesen:
size_t a_size;
fin.read(reinterpret_cast<char*>(&a_size), sizeof(a_size));
a.resize(a_size);
fin.read(reinterpret_cast<char*>(data(a)), sizeof(decltype(a)::value_type) * a_size);
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen