我想将时间保存到现有的txt文件中,以便我可以知道何时添加此特定记录..我有此代码可自动检测时间
time_t Now1;
struct tm * timeinfo;
char time1[20];
time(&Now1);
timeinfo = localtime(&Now1);
strftime(time1, 20, "%d/%m/%Y %H:%M", timeinfo);
Passports.Record_Added_On = time1;
cout << "\n\nRecord Added On: " << Passports.Record_Added_On;
读取txt文件的代码:
fs = new fstream(Passports_FILE_NAME, ios::in | ios::out | ios::binary);
if (!fs)
{
cout << "\n Can't open or create '" << Passports_FILE_NAME << "' file" << "\n";
system("pause");
break;
}
recs_num = -1;
while (fs->read((char *)&Passports, sizeof(Passports)))
{
recs_num++;
if (Passports.ID == id && !Passports.Deleted)
break;
}
if (fs->eof()) //if (the record is not in the file || it's there but it's Deleted)
{
cout << "\nThe specific passports record does not exists in the file.";
closeFile(fs);
cout << "\n\nExit\n";
return 0;
}
即使我显示它也工作得很好..当我关闭程序并再次打开它时... 它显示了像这样的怪异人物或者有时会崩溃..有谁可以帮助我并解释它背后的原因是什么?
答案 0 :(得分:0)
您无法从内存初始化非POD对象(如std :: string类)。这会导致崩溃,因为类不知道它已初始化。无法保证从此代码中正确初始化的所有类成员。假设有一些类成员指向一些内存,为你分配数据。您将其保存到文件,然后再次运行您的应用程序以加载它。然后指针获得相同的数值,但没有更多的内存,他指向。在OS函数调用之后,内存必须由OS分配,在我们的例子中没有调用。因此,下次当您尝试使用这个严重初始化的类对象时 - 它会崩溃,因为它会尝试使用不属于您的应用程序的内存。 要修复此崩溃,您应该正确解析文件内容,然后相应地填写Passports记录。 例如:
int int_value;
std::string string_value;
fs >> int_value >> string_value;
之后你可以初始化你的对象:
Passports.ID = int_value;
Passports.Name = string_value;
等。您应该使用相同的方式将数据保存到文件中(这称为序列化,我建议您更多地搜索该主题)。