2016-11-28 63 views
0

我的問題是弄清楚我的程序出了什麼問題,以及爲什麼它不會寫入我指定的輸出文件。如何將帶有功能的日曆程序輸出到.txt文件

#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); 
} 
+0

我相信你在抱怨,你什麼也看不到,當你使用[可笑的'系統(「暫停」);'黑客(http://stackoverflow.com/questions/1107705/systempause-why-這是錯的嗎)。首先需要關閉()該文件。 –

+0

@SamVarshavchik我很抱歉使用系統(「暫停」);黑客,不幸的是,我只是第一次學習,這是我們在講座中如何結束課程。 –

回答

0
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; 
} 
+0

謝謝@Barmak Shemirani,這幫了我很多。我改變了你所展示的所有功能,並且只用了我自己修復的其他幾個問題。再一次,謝謝你。 –

+0

沒問題。順便說一句,你應該改變閏年的計算,它不是'y%4'。查看更新。 –