我有一个程序,我需要一个选项,将有关事件的信息导入日历。当事件被导出时,每条信息都有自己的行,所以我使用了>>的组合。 operator(用于int类型)和getline(用于字符串)。 有一个更好的方法吗?如此多的输入读取代码似乎有点无组织,也许它也不是解决这个问题最安全的方法。有人建议任何改进吗?此外,之后关闭文件还是自动完成更好?
bool importFunction(const string &file, const Calendar &cal) {
ifstream reader;
reader.open(file);
string type, description, country, city, street;
int day, month, year, fHour, fMinute, fSecond, tHour, tMinute, tSecond,
number_street;
if(reader.is_open()){
getline(reader, type);
getline(reader, description);
reader >> day >> month >> year >> fHour >> fMinute >> fSecond >> tHour >>
tMinute >> tSecond;
reader.ignore();//ignore trailing newline
getline(reader, country);
getline(reader, city);
getline(reader, street);
reader >> number_street;
if(type=="long") {
LongEvent event(description, Date(day, month, year), Time(fHour, fMinute,
fSecond), Time(tHour, tMinute, tSecond), Location(country, city, street,
number_street));
cal.addEvent(event);
}
else if(type=="short") {
ShortEvent event(description, Date(day, month, year), Time(fHour, fMinute,
fSecond), Time(tHour, tMinute, tSecond), Location(country, city, street,
number_street));
cal.addEvent(event);
}
else cout << "FILE WAS NOT OPENED" << endl;
}
答案 0 :(得分:0)
我建议为输入数据集创建一个类,并创建一个处理输入操作的成员函数,无论是来自文件还是任何其他来源。
这种改进只会使您的代码更易读,易懂和面向对象编程。
但是我可以看到你的代码很好。
答案 1 :(得分:0)
您可以使用time_t
(新编译器上的64位整数)将日期/时间值存储为单个值。转换为time_t
和Calendar
结构。代码不一定会更短,但文件大小会更小,因为它只包含一个值。
#include <iostream>
#include <ctime>
#include <fstream>
int main()
{
struct tm timeinfo = { 0 };
timeinfo.tm_year = 2018 - 1900;
timeinfo.tm_mon = 0;//<- January
timeinfo.tm_mday = 1;//<- first
timeinfo.tm_hour = 1;
timeinfo.tm_min = 1;
timeinfo.tm_sec = 1;
time_t rawtime = mktime(&timeinfo);
std::ofstream fout("file.txt");
fout << rawtime;
fout.close();
std::ifstream fin("file.txt");
rawtime = 0;
fin >> rawtime;
struct tm *readtime = localtime(&rawtime);
char buf[100];
strftime(buf, sizeof(buf), "%c\n", readtime);
std::cout << buf;
return 0;
}