如何在c ++中有效地正确读取文件中的输入?

时间:2018-05-26 23:25:39

标签: c++ input ifstream

我有一个程序,我需要一个选项,将有关事件的信息导入日历。当事件被导出时,每条信息都有自己的行,所以我使用了>>的组合。 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;


}

2 个答案:

答案 0 :(得分:0)

我建议为输入数据集创建一个类,并创建一个处理输入操作的成员函数,无论是来自文件还是任何其他来源。

这种改进只会使您的代码更易读,易懂和面向对象编程。

但是我可以看到你的代码很好。

答案 1 :(得分:0)

您可以使用time_t(新编译器上的64位整数)将日期/时间值存储为单个值。转换为time_tCalendar结构。代码不一定会更短,但文件大小会更小,因为它只包含一个值。

#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;
}