繁体   English   中英

如何将具有功能的日历程序输出到.txt文件

[英]How to output a calendar program with functions to a .txt file

我的问题是弄清楚我的程序出了什么问题以及为什么它不会写到我指定的输出文件中。

#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <fstream>
using namespace std;

int numOfDaysInAMonth(int, int);
void printMonth(int);
void printDaysofMonth(int, int&);
void skipToDay(int);
int main()
{
  ofstream ofile;
  ofile.open("calendar.txt");

  int year, firstDayInCurrentMonth;
  int currentMonth = 1;
  int numDays;

  cout << "What year is this? ";
  cin >> year;

  cout << endl;

  cout << " 0 - Sunday\n";
  cout << " 1 - Monday\n";
  cout << " 2 - Tuesday\n";
  cout << " 3 - Wednesday\n";
  cout << " 4 - Thursday\n";
  cout << " 5 - Friday\n";
  cout << " 6 - Saturday\n";

  cout << "What day of then week is Jan 1? ";

  cin >> firstDayInCurrentMonth;

  ofile << year << endl;

  while (currentMonth <= 12) {
    numDays = numOfDaysInAMonth(currentMonth, year);
    printMonth(currentMonth);
    printDaysofMonth(numDays, firstDayInCurrentMonth);
    ofile << endl << endl << endl;
    currentMonth = currentMonth + 1;
  }

  ofile << endl;

  system("pause");
  return 0;
}

我使用ofile输出文本,但未正确返回。

// This function returns the number of days in a month
int numOfDaysInAMonth(int m, int y)
{
  if (m == 1)
    return(31);
  else if (m == 2 && y % 4 != 0)
    return(28);
    if (m == 2 && y % 4 == 0)
        return(29);
  else if (m == 3)
    return(31);
  else if (m == 4)
    return(30);
  else if (m == 5)
    return(31);
  else if (m == 6)
    return(30);
  else if (m == 7)
    return(31);
  else if (m == 8)
    return(31);
  else if (m == 9)
    return(30);
  else if (m == 10)
    return(31);
  else if (m == 11)
    return(30);
  else if (m == 12)
    return(31);
}

    // It takes the number of the month and prints outs the name of the month and the frame of the calander
void printMonth(int m)
{
  ofstream ofile;
  ofile.open("calendar.txt");

  if (m == 1)
  {
    ofile << "January" << endl;
  }
  else if (m == 2)
  {
    ofile << "February" << endl;
  }
  else if (m == 3)
  {
    ofile << "March" << endl;
  }
  else if (m == 4)
  {
    ofile << "April" << endl;
  }
  else if (m == 5)
  {
    ofile << "May" << endl;
  }
  else if (m == 6)
  {
    ofile << "June" << endl;
  }
  else if (m == 7)
  {
    ofile << "July" << endl;
  }
  else if (m == 8)
  {
    ofile << "August" << endl;
  }
  else if (m == 9)
  {
    ofile << "September" << endl;
  }
  else if (m == 10)
  {
    ofile << "October" << endl;
  }
  else if (m == 11)
  {
    ofile << "November" << endl;
  }
  else if (m == 12)
  {
    ofile << "December" << endl;
  }


  ofile << " S  M  T  W  T  F  S" << endl;
  ofile << "_____________________" << endl;
}

// Helps with the skipToDay function
void skip(int i)
{
  ofstream ofile;
  ofile.open("calendar.txt");

  while (i > 0)
  {
    ofile << " ";
    i = i - 1;
  }
}

// This function prints out the days in the month after the header for each month
void printDaysofMonth(int numDays, int &weekDay)
{
  ofstream ofile;
  ofile.open("calendar.txt");

  int day = 1;
  skipToDay(weekDay);
  while (day <= numDays)
  {
    ofile << setw(2) << day << " ";
    if (weekDay == 6)
    {
      ofile << endl;
      weekDay = 0;
    }
    else weekDay = weekDay + 1;
    day = day + 1;
  }
}

// Prints spaces in monthly calander
void skipToDay(int d)
{
  return skip(3 * d);
}
void printDaysofMonth(int numDays, int &weekDay)
{
    ofstream ofile;
    ofile.open("calendar.txt");
    ...
}

int main()
{
  ofstream ofile;
  ofile.open("calendar.txt");
  printDaysofMonth(...);
  ofile << "data...";
  ...
}

该文件已经打开。 第一个流将覆盖第二个流的内容(如果有)。 通过引用将函数更改为通过ofstream

void printDaysofMonth(ofstream &ofile, int numDays, int &weekDay)
{
    ...
}

int main()
{
  ofstream ofile;
  ofile.open("calendar.txt");
  printDaysofMonth(ofile, ...);
  ...
}

通过将数据保留在数组中,可以使程序更短,从而可以进行其他改进。 更少的打字意味着更少的潜在错误。

int is_leap_year(int y)
{
    return (y % 4) == 0 && y % 100 != 0 || y % 400 == 0;
}

int numOfDaysInAMonth(int m, int y)
{
    int days = 0;
    if(m >= 1 && m <= 12)
    {
        const int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        int days = days_in_month[m - 1];
        if(m == 2 && is_leap_year(y))
            days++;
    }
    return days;
}

const char* get_month_name(int m)
{
    const char *month_name[] = { 
        "January", "February", "March", "April", "May", "June", 
        "July", "August", "September", "October", "November", "December" };
    if(m >= 1 && m <= 12)
        return month_name[m - 1];
    return "month name error";
}

void printMonth(ofstream &ofile, int m)
{
    ofile << get_month_name(m) << "\n";
    ofile << " S  M  T  W  T  F  S" << endl;
    ofile << "_____________________" << endl;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM