在 C++ 中保存/写入 txt 文件的时间

Posted

技术标签:

【中文标题】在 C++ 中保存/写入 txt 文件的时间【英文标题】:saving/writing time to txt file in C++ 【发布时间】:2014-04-01 13:24:12 【问题描述】:

我想将时间保存到现有的 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;
            

即使我显示它也能正常工作..但是当我关闭程序并再次打开它时.. 它显示像这样的奇怪字符或有时崩溃..任何人都可以帮助我并解释其背后的原因是什么?

【问题讨论】:

C++ 中,考虑使用std::chrono。我也不确定如何阅读您的问题,请更清楚。 如何写入文件?从您发布的代码中,您写入标准输出 @mic_e 我试图节省进入 txt 文件的时间,这样当我搜索这条记录时,它就会显示出来……但我得到的是图片中的奇怪字符跨度> 尝试空终止time1 @user3442192:你甚至没有显示读取文本文件的代码,我们应该如何找到其中的错误? 【参考方案1】:

您不能从内存中初始化非 POD 对象(例如 std::string 类)。这会导致崩溃,因为类不知道它已被初始化。无法保证所有类成员都从此代码正确初始化。假设有一些类成员是指向某个内存的指针,为您分配数据。您将其保存到文件中,然后再次运行您的应用程序以加载它。然后指针获得相同的数值,但没有更多的内存,他指向。内存必须由操作系统分配,在操作系统函数调用之后,在我们的例子中没有调用。所以下次你尝试使用这个初始化错误的类对象时——它崩溃了,因为它试图使用不属于你的应用程序的内存。 要修复此崩溃,您应该正确解析文件内容,然后相应地填写您的 Passports 记录。 例如:

int int_value;
std::string string_value;
fs >> int_value >> string_value;

之后你就可以初始化你的对象了:

Passports.ID = int_value;
Passports.Name = string_value;

等等。您应该使用相同的方式将数据保存到文件中(这称为序列化,我建议您在该主题上进行更多搜索)。

【讨论】:

上面的特殊字符算crash吗?这是我作业的一部分,我们的讲师已经给了我们程序的原型,例如新的 fstream 等等。问题是如果我更改代码会影响我的整个程序吗?到现在为止,除了回调txt文件中的日期数据时,程序一切正常 没有特殊字符是可以的。崩溃是指您的应用程序突然停止工作。但是,像您一样从文件中读取非 POD 类是完全错误的。即使它没有崩溃 - 这是做事容易出错的方法。您的讲师是否要求您仅以这种方式读取/写入文件? 当我在Passports.Record_Added_On = time1; 之前添加了一个空终止符(例如time1[20] = '\0')时,它会崩溃。那么所有的读/写功能都作为项目的原型给出 由于 time1 变量的大小为 20,因此 time1[20] 位于数组边界的后面,这就是它崩溃的原因。尝试 time1[19] = 0; 那么知道如何修复特殊字符吗?

以上是关于在 C++ 中保存/写入 txt 文件的时间的主要内容,如果未能解决你的问题,请参考以下文章

保存在 txt (c++) 中调用 for 循环的函数的输出

在 C++ 中将数据写入由 CFileDialog 创建的 .txt 文件

将大双数写入txt文件C ++ [重复]

C++:从 txt 文件读取和写入的成员函数

将数据保存到txt文件中? C++

在 C++ 中获取多个输入文件并将其保存在数组中