c - 使用文件存储日历

标签 c file calendar

我对 C 有点陌生。我正在制作一整年的日历并将其存储到文件中。我的主要问题是,每当我尝试创建文件时,它都会显示为空白。我已经尝试弄清楚这个问题有一段时间了,最​​后决定问一下。有人可以告诉我我做错了什么吗?提前致谢!

#include <stdio.h>
#include <stdbool.h>

#define MIN_YEAR  2000
#define MAX_YEAR  3000
#define JANUARY   1
#define FEBRUARY  2
#define MARCH     3
#define APRIL     4
#define MAY       5
#define JUNE      6
#define JULY      7
#define AUGUST    8
#define SEPTEMBER 9
#define OCTOBER   10
#define NOVEMBER  11
#define DECEMBER  12

bool getContinueChoice();
int  getYear          ();
int  getStartingDay   (int year);
bool isLeapYear       (int year);
void makeFile         (int year, int startingDay);
void makeMonthHeading (int month, int year, FILE *file);
int  getNumberOfDays  (int month, int year);

int main()
{
   int startingDay,
       year;

   printInstructions();

   while(getContinueChoice() == true)
   {
      year        = getYear(); 
      startingDay = getStartingDay(year);
      makeFile(year, startingDay);
      printf("\nCalendar made for the year %d.\n", year);
      printf("Look for the file called file.txt to see it.\n");
   }

   printGoodbye();

   return 0;
}

bool getContinueChoice()
{
   char getChoice;
   bool choice;

   scanf(" %c", &getChoice);

   while(getChoice != 'y' || 'n')
   {
      printf("\n***************************************\n");
      printf("* Error: That was not a (y/n) answer. *\n");
      printf("***************************************\n\n");
      printf("Would you like to print a calendar? (y/n): ");
      scanf(" %c", &getChoice);
   }

   if(getChoice == 'y')
   {
      choice = true;
   }
   else
   {
      choice = false;
   }

   return choice;
}

int getYear()
{
   int userYear;

   printf("\nPlease enter a year.\n");
   scanf("%d", &userYear);

   return userYear;
}

int getStartingDay(int year)
{
   int firstDay;   

   firstDay = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + 
               ((year - 1) / 400) + 1) % 7;

return firstDay;
}

bool isLeapYear(int year)
{
   bool leapYear;

   if((!(year % 4) && (year % 100)) || !(year % 400))
   {
      leapYear = true;
   }

   return leapYear;
}

void makeFile(int year, int startingDay)
{
   int   daysInMonth;  
   FILE *file;

   file = fopen("file.txt","w");

   for(int month = JANUARY; month <= DECEMBER; month++)
   {         
      makeMonthHeading(month, year, file);

      fprintf(file, "SUN MON TUE WED THU FRI SAT\n");

      for(int day = 1; day <= 1 + startingDay * 5; day++)
      {
         printf(" ");

         daysInMonth = getNumberOfDays(month, year);      

         for(int days = 1; days <= daysInMonth; days++)
         {
            fprintf(file, "%2d", days);

            if((days + startingDay) % 7 > 0)
            {
               printf(" ");
            }
            else
            {
               printf("\n");
            }
         }
      }  
   }

   printf("Calendar made for the year %d", year);
   printf("\nLook for the file called file.txt to see it.\n\n");

   getContinueChoice();

   return;

}

void makeMonthHeading(int month, int year, FILE *file)
{
   if(month == JANUARY)
   {
      fprintf(file, "JANUARY           %d\n", year);
   }
   else if(month == FEBRUARY)
   {
      fprintf(file, "\nFEBRUARY           %d\n", year);
   }
   else if(month == MARCH)
   {
      fprintf(file, "\nMARCH             %d\n", year);
   }
   else if(month == APRIL)
   {
      fprintf(file, "\nAPRIL             %d\n", year);
   }
   else if(month == MAY)
   {
      fprintf(file, "\nMAY               %d\n", year);
   }
   else if(month == JUNE)
   {
      fprintf(file, "\nJUNE              %d\n", year);
   }
   else if(month == JULY)
   {
      fprintf(file, "\nJULY              %d\n", year);
   }
   else if(month == AUGUST)
   {
      fprintf(file, "\nAUGUST            %d\n", year);
   }
   else if(month == SEPTEMBER)
   {
      fprintf(file, "\nSEPTEMBER         %d\n", year);
   }
   else if(month == OCTOBER)
   {
      fprintf(file, "\nOCTOBER           %d\n", year);
   }
   else if(month == NOVEMBER)
   {
      fprintf(file, "\nNOVEMBER          %d\n", year);
   }
   else if(month == DECEMBER)
   {
      fprintf(file, "\nDECEMBER          %d\n", year);
   }

   return;
}

int getNumberOfDays(int month, int year)
{
   int  monthDays;

   if(month == JANUARY)
   {
      monthDays = 31;
   }
   else if(month == FEBRUARY)
   { 
      if(isLeapYear(year) == true)
      {
         monthDays = 29;
      }
      else
      {
         monthDays = 28;
      }
   }
   else if(month == MARCH)
   {
      monthDays = 31;
   }
   else if(month == APRIL)
   {
      monthDays = 30;
   }
   else if(month == MAY)
   {
      monthDays = 31;
   }
   else if(month == JUNE)
   {
      monthDays = 30;
   }
   else if(month == JULY)
   {
      monthDays = 31;
   }
   else if(month == AUGUST)
   {
      monthDays = 31;
   }
   else if(month == SEPTEMBER)
   {
      monthDays = 30;
   }
   else if(month == OCTOBER)
   {
      monthDays = 31;
   }
   else if(month == NOVEMBER)
   {
      monthDays = 30;
   }
   else if(month == DECEMBER)
   {
      monthDays = 31;
   }

   return monthDays;
}

最佳答案

您在同一行有两个问题:

while(getChoice != 'y' || 'n')
  • 这并不像你想象的那样。让我们看一个示例,其中 getChoice = 'a'

    第一个操作 getChoice != 'y' 将计算为 TRUE,因为 'a' != 'y'。请记住,您将从该操作中得到TRUE

    现在,你只剩下TRUE || 'n' 始终为 TRUE

    因此,您的 while 条件将始终为 TRUE,这就是您陷入该循环的原因。

如果你解决这个问题

while((getChoice != 'y') || (getChoice != 'n'))

您将意识到该行的第二个问题,这是您的逻辑。

  • 想象一下,如果用户输入'y'。然后会发生什么?

    (getChoice != 'y') 将为 FALSE,但 (getChoice != 'n') 将为 TRUE,因此您的 while 条件将为 TRUE,并且您将再次陷入该循环。

    考虑一下其他场景,然后你会得出结论,你需要使用 && 而不是 ||

因此,将该行更改为:

while((getChoice != 'y') && (getChoice != 'n'))

此外,正如@purec所说,您需要在完成文件后fclose()该文件。

关于c - 使用文件存储日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49760762/

相关文章:

c - 理解 C 中的无符号 0

file - CakePHP HTTPsocket POST 文件上传

node.js - 如何防止用户上传文件并消耗带宽?

android - 从日历中减去天数

php - MySQL 数据库访问速度主要受数据库限制,还是受用于访问它的语言限制?

c中的圆形数组用于延迟线

c - 为什么我无法读取文件?

java - 计算 java 日期差异时出错

java - 如何以编程方式将事件添加到 Outlook 日历或 Google 日历?

c - 如何让子窗口的父窗口(也就是拥有的窗口)在 winapi 中保持事件状态?