Инициализация QFile и QTextStream
Меня интересует такой вопрос
Знаю что глупый, не ругайтесь сильно :)
Нужно приинициализировать объект класса QFile
Во всех источниках это делается так:
Цитата:
QFile file("file.txt");
Хорошо, но если нам нужно затем реинициализировать этот файл?
Как это записать?
file = QFile("file.txt") не работает
file("file.txt") - естественно, тоже
file.setFileName - не предлагать
То же касается и QTextStream
И что, неужели никак?
Раз так хочется, new/delete конечно никто не отменял, однако сдается мне у кого-то просто хр*новый дизайн, если он вообще есть.
Как понять?
А что ты вообще имеешь ввиду под реинициализировать?
Цитата: arrjj
У QFile Q_DISABLE_COPY.
А что ты вообще имеешь ввиду под реинициализировать?
А что ты вообще имеешь ввиду под реинициализировать?
Вообщем, у меня такая ситуация
Код:
//класс лога
class LogFile {
private:
QTextStream stream;
public:
LogFile();
~LogFile();
void Save(QString text);
};
LogFile::LogFile() {
QFile file("log.log");
//file.setFileName("log.log");
//создать и открыть на дозапись
if (!file.open(QIODevice::Append | QIODevice::Text)) {
QMessageBox::warning(0, QObject::tr("File error"), QObject::tr("Log file create error!"));
}
//QTextStream stream(&file);
//ВОТ ТУТ как-то надо проинициализировать поток
}
LogFile::~LogFile() {
file.close();
}
void LogFile::Save(QString text) {
//а ВОТ ТУТ как-то записать в него текст
stream << text;
}
class LogFile {
private:
QTextStream stream;
public:
LogFile();
~LogFile();
void Save(QString text);
};
LogFile::LogFile() {
QFile file("log.log");
//file.setFileName("log.log");
//создать и открыть на дозапись
if (!file.open(QIODevice::Append | QIODevice::Text)) {
QMessageBox::warning(0, QObject::tr("File error"), QObject::tr("Log file create error!"));
}
//QTextStream stream(&file);
//ВОТ ТУТ как-то надо проинициализировать поток
}
LogFile::~LogFile() {
file.close();
}
void LogFile::Save(QString text) {
//а ВОТ ТУТ как-то записать в него текст
stream << text;
}
Я думаю как - создам поток, и буду в него писать
Чтобы каждый раз, когда хочу что-то записать, не создавать поток
НО ПОТОК не инициализируется так, как я хочу!
Код:
QFile file; // вначале можно не указывать файл
file.setFileName("file1.txt"); // указываем файл
file.open(QIODevice::WriteOnly); // открываем его для записи
QTextStream stream; // создаём stream... тоже можно сразу не указывать, а указать потом
stream.setDevice(&file); // указываем, что работать будем с нашим файлом
stream << "My Text"; // записываем
file.close(); // закрываем файл
file.setFileName("file2.txt"); // указываем другое имя файла
file.open(QIODevice::WriteOnly); // опять открываем для записи, но уже другой файл
stream << "Text2"; // опять записываем
file.close(); // и закрываем его
file.setFileName("file1.txt"); // указываем файл
file.open(QIODevice::WriteOnly); // открываем его для записи
QTextStream stream; // создаём stream... тоже можно сразу не указывать, а указать потом
stream.setDevice(&file); // указываем, что работать будем с нашим файлом
stream << "My Text"; // записываем
file.close(); // закрываем файл
file.setFileName("file2.txt"); // указываем другое имя файла
file.open(QIODevice::WriteOnly); // опять открываем для записи, но уже другой файл
stream << "Text2"; // опять записываем
file.close(); // и закрываем его
Тема закрыта :)
Цитата: Lindemann66
file.setFileName - не предлагать
нню-ню
ПыСы Лучше даж раз лог file.write(QString(tr("[")+QDateTime::date().toString(tr("yyyy.MM.dd"))+tr("/")+QDateTime::time().toString(tr("H:mm"))+tr("]: ")+text+tr("\n")).toUtf8())
(както длинно получилось :D)
Да да, самая фишка использовать в логе аллокации и логировать неудачные и все это наряду с отсутствием синхронизации.
Код:
file.write((QTime::currentTime().toString(Qt::LocalDate) + " - ").toAscii());
будет делать именно ДОЗАПИСЬ в файл?
Мне ведь дозапись нужна
ХЗ - попробуй. Как чё у QFile есть seek
Код:
LogFile::LogFile(bool _use) {
use = _use;
if (use) {
file.setFileName("log.log");
//если файл есть - удалить
if (file.exists()) {
file.remove();
}
//создать и открыть на дозапись
if (!file.open(QIODevice::Append | QIODevice::Text)) {
QMessageBox::warning(0, QObject::tr("File error"), QObject::tr("Log file create error!"));
return;
}
//указываем, что работать будем с нашим файлом
stream.setDevice(&file);
}
}
LogFile::~LogFile() {
if (use) {
file.close();
}
}
void LogFile::Save(QString text) {
if (use) {
if (text != "") {
file.write("123");
//stream << QTime::currentTime().toString(Qt::LocalDate) + " - ";
//stream << text;
}
//stream << "\n";
}
}
use = _use;
if (use) {
file.setFileName("log.log");
//если файл есть - удалить
if (file.exists()) {
file.remove();
}
//создать и открыть на дозапись
if (!file.open(QIODevice::Append | QIODevice::Text)) {
QMessageBox::warning(0, QObject::tr("File error"), QObject::tr("Log file create error!"));
return;
}
//указываем, что работать будем с нашим файлом
stream.setDevice(&file);
}
}
LogFile::~LogFile() {
if (use) {
file.close();
}
}
void LogFile::Save(QString text) {
if (use) {
if (text != "") {
file.write("123");
//stream << QTime::currentTime().toString(Qt::LocalDate) + " - ";
//stream << text;
}
//stream << "\n";
}
}
Код:
#ifndef QLOGFILE_H
#define QLOGFILE_H
//раскомментить для отладки или в .pro для debug-сборки указать
//#define QLOGFILEDEBUG
#include <QFile>
#include <QFileInfo>
#include <QString>
#include <QDateTime>
#include <QCoreApplication>
#ifdef QLOGFILEDEBUG
#include <QDebug>
#endif
class QLogFile : private QFile
{
Q_OBJECT
public:
explicit QLogFile(QObject *parent = 0);
explicit QLogFile(const QString &logfilename,QObject *parent = 0);
~QLogFile();
public slots:
void setLogFileName(const QString &logfilename);
void writeLog(const QString &logtext,bool addtimestamp=true);
void clearLog();
private:
QString currentlogname;
bool openLog();
Q_DISABLE_COPY(QLogFile)
};
#endif // QLOGFILE_H
#define QLOGFILE_H
//раскомментить для отладки или в .pro для debug-сборки указать
//#define QLOGFILEDEBUG
#include <QFile>
#include <QFileInfo>
#include <QString>
#include <QDateTime>
#include <QCoreApplication>
#ifdef QLOGFILEDEBUG
#include <QDebug>
#endif
class QLogFile : private QFile
{
Q_OBJECT
public:
explicit QLogFile(QObject *parent = 0);
explicit QLogFile(const QString &logfilename,QObject *parent = 0);
~QLogFile();
public slots:
void setLogFileName(const QString &logfilename);
void writeLog(const QString &logtext,bool addtimestamp=true);
void clearLog();
private:
QString currentlogname;
bool openLog();
Q_DISABLE_COPY(QLogFile)
};
#endif // QLOGFILE_H
qlogfile.cpp
Код:
#include "qlogfile.h"
QLogFile::QLogFile(QObject *parent) :
QFile(parent)
{
currentlogname=QCoreApplication::applicationFilePath()+tr(".log");
setFileName(currentlogname);
openLog();
}
QLogFile::QLogFile(const QString &logfilename,QObject *parent):QFile(parent),currentlogname(logfilename)
{
setFileName(currentlogname);
openLog();
}
void QLogFile::setLogFileName(const QString &logfilename)
{
if(currentlogname!=logfilename)
{
currentlogname=logfilename;
if(isOpen())
{
flush();
close();
}
setFileName(currentlogname);
openLog();
}
#ifdef QLOGFILEDEBUG
else
qDebug()<<tr("QLogFile::setLogFileName(QString) new log name same as current log name ")<<currentlogname;
#endif
}
void QLogFile::writeLog(const QString &logtext,bool addtimestamp)
{
if(!openLog())
{
return;
}
QString writestring=logtext+tr("\n");
if(addtimestamp)
writestring=QDateTime::currentDateTime().toString(tr("[ yyyy.MM.dd hh:mm:ss ]: "))+writestring;
if(write(writestring.toUtf8())!=writestring.toUtf8().size())
{
#ifdef QLOGFILEDEBUG
qDebug()<<tr("QLogFile::writeLog(QString) Can't write to file ")<<currentlogname<<tr(" text: ")<<writestring;
#endif
}
else
flush();
}
void QLogFile::clearLog()
{
if(openLog())
{
resize(0);
seek(0);
}
}
bool QLogFile::openLog()
{
if(!isOpen())
{
if(!open(QFile::Unbuffered|QFile::ReadWrite|QFile::Text))
{
#ifdef QLOGFILEDEBUG
qDebug()<<tr("QLogFile::openLog() Can't open log file ")<<currentlogname;
#endif
return false;
}
else
{
if(!seek(size()))
{
#ifdef QLOGFILEDEBUG
qDebug()<<tr("QLogFile::openLog() Can't seek to end ")<<currentlogname<<tr(" file size: ")<<size;
#endif
return false;
}
}
}
return true;
}
QLogFile::~QLogFile()
{
if(isOpen())
{
flush();
close();
}
}
QLogFile::QLogFile(QObject *parent) :
QFile(parent)
{
currentlogname=QCoreApplication::applicationFilePath()+tr(".log");
setFileName(currentlogname);
openLog();
}
QLogFile::QLogFile(const QString &logfilename,QObject *parent):QFile(parent),currentlogname(logfilename)
{
setFileName(currentlogname);
openLog();
}
void QLogFile::setLogFileName(const QString &logfilename)
{
if(currentlogname!=logfilename)
{
currentlogname=logfilename;
if(isOpen())
{
flush();
close();
}
setFileName(currentlogname);
openLog();
}
#ifdef QLOGFILEDEBUG
else
qDebug()<<tr("QLogFile::setLogFileName(QString) new log name same as current log name ")<<currentlogname;
#endif
}
void QLogFile::writeLog(const QString &logtext,bool addtimestamp)
{
if(!openLog())
{
return;
}
QString writestring=logtext+tr("\n");
if(addtimestamp)
writestring=QDateTime::currentDateTime().toString(tr("[ yyyy.MM.dd hh:mm:ss ]: "))+writestring;
if(write(writestring.toUtf8())!=writestring.toUtf8().size())
{
#ifdef QLOGFILEDEBUG
qDebug()<<tr("QLogFile::writeLog(QString) Can't write to file ")<<currentlogname<<tr(" text: ")<<writestring;
#endif
}
else
flush();
}
void QLogFile::clearLog()
{
if(openLog())
{
resize(0);
seek(0);
}
}
bool QLogFile::openLog()
{
if(!isOpen())
{
if(!open(QFile::Unbuffered|QFile::ReadWrite|QFile::Text))
{
#ifdef QLOGFILEDEBUG
qDebug()<<tr("QLogFile::openLog() Can't open log file ")<<currentlogname;
#endif
return false;
}
else
{
if(!seek(size()))
{
#ifdef QLOGFILEDEBUG
qDebug()<<tr("QLogFile::openLog() Can't seek to end ")<<currentlogname<<tr(" file size: ")<<size;
#endif
return false;
}
}
}
return true;
}
QLogFile::~QLogFile()
{
if(isOpen())
{
flush();
close();
}
}
Посмотрим, если нужно будет расширить свой, буду его использовать
Единственное, не нашёл место, где запись в файл то собственно происходит (не в консоль)
Цитата: Lindemann66
Единственное, не нашёл место, где запись в файл то собственно происходит (не в консоль)
Код:
if(write(writestring.toUtf8())!=writestring.toUtf8().size())
Точно
Откройте уже для себя Logging фреймворки
Цитата: Phodopus
Откройте уже для себя Logging фреймворки
Спасибо я в курсе существования log4j/cxx/qt , QxtLogger и Pantheios . Вопрос темы то был другой.
Да я ТС-у. Я смотрю он логгинг в итоге делает.
Не ну если за всю работу программы надо всего там пару сообщений в лог вывести, то чтото большое и многофункциональное нет смысла использовать.
Цитата: arrjj
Не ну если за всю работу программы надо всего там пару сообщений в лог вывести, то чтото большое и многофункциональное нет смысла использовать.
Ну как-же: "logging is a platform". А по сему только могучий фреймворк спасет отцов русской демократии.