2016-05-26 5 views
-1

私はロギングクラスをテストするための基本的なfizzbuzzプログラムを作成しました。何らかの理由でデータがコンソールに正しくダンプされ、私がそれを開くたびに。Ofstreamは作成しますが、ファイルに書き込むことはありません

int main() 
{ 
    logger* loggerObj = logger::createLogger("log.txt"); 

    for (int i = 1; i <= 100; i++) 
    { 
     loggerObj->createLogEvent(i); 

     if (i == 15) 
     { 
      loggerObj->writeLog(); 
     } 
} 

、これは私のクラスである:

私の主はここにある、これは私のクラスのヘッダーが

int logger::m_instanceCount = 0; 
logger* logger::loggerObj = new logger; 
string logger::m_fileName = "log.txt"; 

logger::logger() 
{ 
} 

logger::~logger() 
{ 
} 

logger* logger::createLogger(string fileName) 
{ 
    if (m_instanceCount == 0) 
    { 
     loggerObj = new logger; 
     m_fileName = fileName; 

     return loggerObj; 
    } 
    else 
    { 
     return loggerObj; 
    } 
} 

bool logger::addLogToQueue(logEvent event) 
{ 
    if (m_queueID == 15) 
    { 
     return false; 
    } 
    else 
    { 
     queue[m_queueID] = event; 
     m_queueID++; 
     return true; 
    } 
} 

void logger::logQueue() 
{ 
    for (int i = 0; i <= m_queueID; i++) 
    { 
     int level = getEventLevel(i); 
     string message = getEventMessage(i); 

     writeLog(); 
    } 
} 

int logger::getEventLevel(int logID) 
{ 
    return queue[logID].logLevel; 
} 

string logger::getEventMessage(int logID) 
{ 
    return queue[logID].logMessage; 
} 

void logger::writeLog() 
{ 
    ofstream log(m_fileName, ios::out); 
    log.open(m_fileName, ios::out); 
    log.flush(); 
    string prefix; 
    int level; 
    string message; 
    int queueSize = m_queueID; 

    for (int i = 0; i <= queueSize - 1; i++) 
    { 
     level = queue[i].logLevel; 
     message = queue[i].logMessage; 

     switch (level) 
     { 
     case 1: 
      prefix = "[Fizz] "; 
      break; 
     case 2: 
      prefix = "[Buzz] "; 
      break; 
     case 3: 
      prefix = "[FizzBuzz] "; 
      break; 
     default: 
      prefix = "[Number] "; 
      break; 
     } 

     string fullMessage = prefix.append(message); 
     cout << fullMessage << endl; 
     log << fullMessage << endl; 

     m_queueID--; 
    } 

    log.close(); 
} 

void logger::createLogEvent(int number) 
{ 
    logEvent event; 
    if (number % 3 == 0 && number % 5 == 0) 
    { 
     event.logLevel = 3; 
     event.logMessage = to_string(number); 
    } 
    else if (number % 3 == 0) 
    { 
     event.logLevel = 1; 
     event.logMessage = to_string(number); 
    } 
    else if (number % 5 == 0) 
    { 
     event.logLevel = 2; 
     event.logMessage = to_string(number); 
    } 
    else 
    { 
     event.logMessage = to_string(number); 
    } 

    addLogToQueue(event); 
} 

です:これが私の最初の時間はとてもログインしようとしている

#ifndef LOGGER_INCLUDED 
#define LOGGER_INCLUDED 

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

class logger 
{ 
public: 
    ~logger(); 
    struct logEvent; 
    static logger* createLogger(string); 
    bool addLogToQueue(logEvent); 
    void logQueue(); 
    void createLogEvent(int); 
    int getEventLevel(int); 
    string getEventMessage(int); 
    void writeLog(); 
private: 
    logger(); 
    struct logEvent 
    { 
     string logMessage; 
     int logLevel; 
    }; 
    static int m_instanceCount; 
    static logger* loggerObj; 
    static string m_fileName; 
    logEvent queue[15]; 
    int m_queueID = 0; 
}; 

#endif 

それは簡単な間違いが私を許してください。前もって感謝します。また、これは最高または最も効率的であるように設計されたものではなく、単なるトレーニングであり、シングルトンや待ち行列の使用は必要ありません。ちょっとしたものを試してみてください。

+0

私はあなたがこのコードの作成にどのように近づいてきたのか分かりませんが、増分変更とテストを行うことになっています。ファイルに書き込むことができないということは、そのようなクラスを書く過程の早い段階で捕らえられていたはずです。 – PaulMcKenzie

+0

@PaulMcKenzieは全体を読んでください、私は下に概略を示しました、これは単なる訓練です。私はソフトウェアを書くプロセスを理解していますが、通常はgmockを使ってTDDの方法でこれを行いますが、いくつかのことを試していて、それを削除してTDDする必要はありませんでした。 – Tyler

+0

ファイルを開いて2回読み取ります。 'ofstream log(m_fileName、ios :: out); "log.open(m_fileName、ios :: out); ' –

答えて

0
ofstream log(m_fileName, ios::out); 
log.open(m_fileName, ios::out); 

コンストラクタがファイルを開きます。

直後に、2行目でファイルが再度open()になります。それは誤りです。ファイルストリームのstd::failbitが設定され、以降の書き込み操作はすべて失敗します。

0

これは今修正されました。二度開いている。

+0

答えとして役立つように詳細が必要です。現在のところ、これは回答としてのコメントです。 – user4581301

関連する問題