Как эффективно и правильно читать ввод из файла в c ++? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть программа, в которой мне нужна опция для импорта информации о событии в календарь.Когда события экспортируются, каждая часть информации имеет свою собственную строку, поэтому я использую комбинацию оператора >> (для типов 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 голосов
/ 27 мая 2018

Вы можете сохранить значение даты / времени как одно значение с помощью 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;
}
0 голосов
/ 27 мая 2018

Я бы предложил создать класс для набора входных данных и создать функцию-член, которая работает с операциями ввода, будь то из файла или из любого другого источника.

Это улучшение просто сделает вашекод более читаемый, понятный и объектно-ориентированный.

Но, как я вижу, ваш код в порядке.

...