Thi*_*sen 1 c++ fstream vector
我对编程有些新意,所以我不确定如何搜索这个问题,我知道我问过其他2个问题,但我似乎无法使它工作.
我遇到了一个问题,我有一个向量:
vector<Device*> Devicelist_;
Run Code Online (Sandbox Code Playgroud)
我试图加载设备使用这个功能(我已经做了一个保存功能,它有效):
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;
}
Run Code Online (Sandbox Code Playgroud)
问题是LoadFile.read()不会将任何设备加载到设备列表中.
你能看出我的问题是什么吗?提前致谢.
你的问题其实很简单.你忘了重置你的获取位置:
LoadFile.seekg(0, ios::end);
int numberOfDevices = LoadFile.tellg() / sizeof(Device);
for (int i = 0; i < numberOfDevices; i++)
Run Code Online (Sandbox Code Playgroud)
应该
LoadFile.seekg(0, ios::end);
int numberOfDevices = LoadFile.tellg() / sizeof(Device);
LoadFile.seekg(0L, ios::beg);
for (int i = 0; i < numberOfDevices; i++)
Run Code Online (Sandbox Code Playgroud)
查找号码的另一种方法是使用stat:
#include <sys/stat.h>
int getNumberOfDevices(char *filename)
{
struct stat st;
return st.st_size / sizeof(Device);
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你想避免使用stat,你可以这样做:
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;
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,它可以读取所有这些内容,而不会弄乱位置,并在完成时保持计数.