c++ - sirve - La función de lectura de Ifstream no se carga en el vector
manejo de archivos en c++ fstream (2)
Esta línea
LoadFile.seekg(0, ios::end);
pone el archivo al final del archivo. Tienes que volver a ponerlo al principio
LoadFile.seekg(0, ios::beg);
Actualizar
Puede simplificar el código guardando la cantidad de Device
s en la parte superior del archivo. Entonces, puedes usar:
int numberOfDevices = 0;
LoadFile.read(&numberOfDevies, sizeof(int));
for (int i = 0; i < numberOfDevices; i++)
No será necesario obtener el tamaño del archivo para deducir el número de Device
.
La otra alternativa es la sugerida por @ phyrrus9 donde continúa leyendo los Device
hasta que no haya más Device
para leer del archivo.
Soy un poco nuevo en la programación, así que no estoy seguro de cómo buscar este problema, y sé que hice otras 2 preguntas sobre esto, pero parece que no puedo hacerlo funcionar.
Tengo un problema, donde tengo un vector:
vector<Device*> Devicelist_;
Donde intento cargar Dispositivos para usar esta función (ya hice una función Guardar, que funciona):
bool Devicelist::LoadFromFile() //Opdaterer vector<Device> fra fil
{
ifstream LoadFile("Devices.dat", ios::in | ios::binary);
if (!LoadFile)
{
cerr << "File could not be opened." << endl;
return false;
}
LoadFile.seekg(0, ios::end);
int numberOfDevices = LoadFile.tellg() / sizeof(Device);
for (int i = 0; i < numberOfDevices; i++)
{
Devicelist_.push_back(new Device);
LoadFile.read(reinterpret_cast<char *>(Devicelist_[i]), sizeof(Device));
}
cout << Devicelist_[0]->getName() << endl;
LoadFile.close();
return true;
}
El problema es que LoadFile.read()
no carga ningún dispositivo en la lista de proveedores.
¿Puedes ver cuál es mi problema? Gracias por adelantado.
Tu problema es realmente muy simple. Olvidó restablecer su posición de obtención:
LoadFile.seekg(0, ios::end);
int numberOfDevices = LoadFile.tellg() / sizeof(Device);
for (int i = 0; i < numberOfDevices; i++)
debiera ser
LoadFile.seekg(0, ios::end);
int numberOfDevices = LoadFile.tellg() / sizeof(Device);
LoadFile.seekg(0L, ios::beg);
for (int i = 0; i < numberOfDevices; i++)
Una alternativa para encontrar el número es usar estadísticas:
#include <sys/stat.h>
int getNumberOfDevices(char *filename)
{
struct stat st;
return st.st_size / sizeof(Device);
}
o, si desea evitar la estadística, podría hacer algo como esto:
bool Devicelist::LoadFromFile() //Opdaterer vector<Device> fra fil
{
ifstream LoadFile("Devices.dat", ios::in | ios::binary);
if (!LoadFile)
{
cerr << "File could not be opened." << endl;
return false;
}
int numberOfDevices = 0;
while (true)
{
Device *tmp = new device;
LoadFile.read(reinterpret_cast<char *>(tmp), sizeof(Device));
if (LoadFile.good()) //we successfully read one
{
++numberOfDevices;
Devicelist_.push_back(tmp);
}
else break; //get out of the infinite loop
}
cout << Devicelist_[0]->getName() << endl;
LoadFile.close();
return true;
}
De esta forma, los lee a todos, sin perder posiciones, y lleva un conteo cuando termina.