подскажите по переаче переменных
От: Аноним  
Дата: 10.09.08 13:57
Оценка:
Нужен совет по передаче переменных(не аргументов) в с++ из функций в объявленных в разных си-файликах программы.
К примеру мне нужно писать лог из разных мест программы, как сделать так, что-бы не открывтаь постоянно файл в каждый необходимый момент?
лог пишу вот так...
 fstream outputFile("d:\out.log");
 if(!outputFile.is_open())
     throw (ios::failure("Could't open file"));
     char loG;;
     outputFile << loG;
     outputFile.close();
Re: подскажите по переаче переменных
От: placement_new  
Дата: 10.09.08 14:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужен совет по передаче переменных(не аргументов) в с++ из функций в объявленных в разных си-файликах программы.

А>К примеру мне нужно писать лог из разных мест программы, как сделать так, что-бы не открывтаь постоянно файл в каждый необходимый момент?
А>лог пишу вот так...
А>
А> fstream outputFile("d:\out.log");
А> if(!outputFile.is_open())
А>     throw (ios::failure("Could't open file"));
А>     char loG;;
А>     outputFile << loG;
А>     outputFile.close();
А>

Оберни в синглтон, где методы close, open, write итд
Re: подскажите по переаче переменных
От: bordima Беларусь  
Дата: 10.09.08 15:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужен совет по передаче переменных(не аргументов) в с++ из функций в объявленных в разных си-файликах программы.

А>К примеру мне нужно писать лог из разных мест программы, как сделать так, что-бы не открывтаь постоянно файл в каждый необходимый момент?
А>лог пишу вот так...
А>
А> fstream outputFile("d:\out.log");
А> if(!outputFile.is_open())
А>     throw (ios::failure("Could't open file"));
А>     char loG;;
А>     outputFile << loG;
А>     outputFile.close();
А>


Написать обертку


//Logger.h
#include<string>
#include<fstream>

using std::string;
using std::fstream;

class Logger
{
    fstream outputFile;
public:
    Logger(string fileName);
    void AddEntry(string entry);
    ~Logger();
};



// Logger.cpp

#include "Logger.h"
Logger::Logger(string fileName)
:outputFile(fileName.c_str(), std::ios_base::out)
{
    if(!outputFile.is_open())
        throw (std::ios::failure("Could't open file"));
}
void Logger::AddEntry(string entry)
{
    outputFile << entry<<std::endl;
}
Logger::~Logger()
{
    outputFile.close();
}


Перед main-функцией создать глобальную переменную класса обертки (Logger)

#include "Logger.h"

Logger logger("d:\\out.log");

void f1(void);
void f2(void);

int main()
{
    logger.AddEntry("---Start---");
    f1();
    f2();
    logger.AddEntry("---End---");
    return 0;
}


а из остальных единиц трансляции ссылаться на нее

// с1.cpp
#include "Logger.h"

extern Logger logger;

void f1(void)
{
    logger.AddEntry("f1");
}


//c2.cpp
#include "Logger.h"

extern Logger logger;

void f2(void)
{
    logger.AddEntry("f2");
}


После запуска получим файл "d:\out.log"

---Start---
f1
f2
---End---
Re[2]: подскажите по переаче переменных
От: silart  
Дата: 10.09.08 15:25
Оценка:
Здравствуйте, bordima, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Нужен совет по передаче переменных(не аргументов) в с++ из функций в объявленных в разных си-файликах программы.

А>>К примеру мне нужно писать лог из разных мест программы, как сделать так, что-бы не открывтаь постоянно файл в каждый необходимый момент?
А>>лог пишу вот так...
А>>
А>> fstream outputFile("d:\out.log");
А>> if(!outputFile.is_open())
А>>     throw (ios::failure("Could't open file"));
А>>     char loG;;
А>>     outputFile << loG;
А>>     outputFile.close();
А>>


B>Написать обертку



B>
B>//Logger.h
B>#include<string>
B>#include<fstream>

B>using std::string;
B>using std::fstream;

B>class Logger
B>{
B>    fstream outputFile;
B>public:
B>    Logger(string fileName);
B>    void AddEntry(string entry);
B>    ~Logger();
B>};
B>



B>
B>// Logger.cpp

B>#include "Logger.h"
B>Logger::Logger(string fileName)
B>:outputFile(fileName.c_str(), std::ios_base::out)
B>{
B>    if(!outputFile.is_open())
B>        throw (std::ios::failure("Could't open file"));
B>}
B>void Logger::AddEntry(string entry)
B>{
B>    outputFile << entry<<std::endl;
B>}
B>Logger::~Logger()
B>{
B>    outputFile.close();
B>}
B>


B>Перед main-функцией создать глобальную переменную класса обертки (Logger)


B>
B>#include "Logger.h"

B>Logger logger("d:\\out.log");

B>void f1(void);
B>void f2(void);

B>int main()
B>{
B>    logger.AddEntry("---Start---");
B>    f1();
B>    f2();
B>    logger.AddEntry("---End---");
B>    return 0;
B>}
B>


B>а из остальных единиц трансляции ссылаться на нее


B>
B>// с1.cpp
B>#include "Logger.h"

B>extern Logger logger;

B>void f1(void)
B>{
B>    logger.AddEntry("f1");
B>}
B>


B>
B>//c2.cpp
B>#include "Logger.h"

B>extern Logger logger;

B>void f2(void)
B>{
B>    logger.AddEntry("f2");
B>}
B>


B>После запуска получим файл "d:\out.log"


B>
B>---Start---
B>f1
B>f2
B>---End---
B>


Идея с синглетоном мне кажется более привлекательной. Лучше использовать синглеьон Мейерса.
Re[3]: подскажите по переаче переменных
От: bordima Беларусь  
Дата: 10.09.08 15:41
Оценка:
Здравствуйте, silart, Вы писали:
S>Идея с синглетоном мне кажется более привлекательной. Лучше использовать синглеьон Мейерса.

В целом вы правы, но в вашем примере пофигу.
Re[2]: подскажите по переаче переменных
От: alzt  
Дата: 11.09.08 06:33
Оценка:
Здравствуйте, bordima, Вы писали:

B>
B>//Logger.h
B>#include<string>
B>#include<fstream>

B>using std::string;
B>using std::fstream;

B>class Logger
B>{
B>    fstream outputFile;
B>public:
B>    Logger(string fileName);
B>    void AddEntry(string entry);
B>    ~Logger();
B>};
B>



B>
B>// Logger.cpp

B>#include "Logger.h"
B>void Logger::AddEntry(string entry)
B>{
B>    outputFile << entry<<std::endl;
B>}
B>


Здесь, возможно, нужно добавить скидывание данных на диск, если велика вероятность краха программы.
Плюс передавать строки по константной ссылке.
Re[3]: подскажите по переаче переменных
От: bordima Беларусь  
Дата: 11.09.08 06:46
Оценка:
Здравствуйте, alzt, Вы писали:
A>Здесь, возможно, нужно добавить скидывание данных на диск, если велика вероятность краха программы.
A>Плюс передавать строки по константной ссылке.

Вы абсолютно правы.
Re[3]: Скидывание на диск
От: Аноним  
Дата: 11.09.08 07:49
Оценка:
Здравствуйте, alzt, Вы писали:

A>Здесь, возможно, нужно добавить скидывание данных на диск, если велика вероятность краха программы.

A>Плюс передавать строки по константной ссылке.

Скидывание данных на диск и запись их в файл — это разве не одно и то же?
Re[4]: Скидывание на диск
От: bordima Беларусь  
Дата: 11.09.08 08:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, alzt, Вы писали:


A>>Здесь, возможно, нужно добавить скидывание данных на диск, если велика вероятность краха программы.

A>>Плюс передавать строки по константной ссылке.

А>Скидывание данных на диск и запись их в файл — это разве не одно и то же?


Имеется в виду, что данные буферизируются и при аварийном завершении программы могут быть не сохранены на диске.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.