Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Инициализация QFile и QTextStream

5.7K
29 августа 2011 года
Lindemann66
193 / / 21.07.2011
Всем привет! :)

Меня интересует такой вопрос
Знаю что глупый, не ругайтесь сильно :)

Нужно приинициализировать объект класса QFile
Во всех источниках это делается так:
Цитата:

QFile file("file.txt");



Хорошо, но если нам нужно затем реинициализировать этот файл?
Как это записать?

file = QFile("file.txt") не работает
file("file.txt") - естественно, тоже
file.setFileName - не предлагать

То же касается и QTextStream

И что, неужели никак?

260
29 августа 2011 года
Ramon
1.1K / / 16.08.2003
Раз так хочется, new/delete конечно никто не отменял, однако сдается мне у кого-то просто хр*новый дизайн, если он вообще есть.
5.7K
29 августа 2011 года
Lindemann66
193 / / 21.07.2011
Как понять?
277
29 августа 2011 года
arrjj
1.7K / / 26.01.2011
У QFile Q_DISABLE_COPY.
А что ты вообще имеешь ввиду под реинициализировать?
5.7K
29 августа 2011 года
Lindemann66
193 / / 21.07.2011
Цитата: 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;  
}


Я думаю как - создам поток, и буду в него писать
Чтобы каждый раз, когда хочу что-то записать, не создавать поток
НО ПОТОК не инициализируется так, как я хочу!
5.7K
29 августа 2011 года
Lindemann66
193 / / 21.07.2011
Код:
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(); // и закрываем его


Тема закрыта :)
14
29 августа 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: Lindemann66

file.setFileName - не предлагать


нню-ню

277
30 августа 2011 года
arrjj
1.7K / / 26.01.2011
А не проще просто file.write(text.toUtf8())?
ПыСы Лучше даж раз лог file.write(QString(tr("[")+QDateTime::date().toString(tr("yyyy.MM.dd"))+tr("/")+QDateTime::time().toString(tr("H:mm"))+tr("]: ")+text+tr("\n")).toUtf8())
(както длинно получилось :D)
260
30 августа 2011 года
Ramon
1.1K / / 16.08.2003
Да да, самая фишка использовать в логе аллокации и логировать неудачные и все это наряду с отсутствием синхронизации.
5.7K
30 августа 2011 года
Lindemann66
193 / / 21.07.2011
А
 
Код:
file.write((QTime::currentTime().toString(Qt::LocalDate) + " - ").toAscii());


будет делать именно ДОЗАПИСЬ в файл?
Мне ведь дозапись нужна
277
30 августа 2011 года
arrjj
1.7K / / 26.01.2011
ХЗ - попробуй. Как чё у QFile есть seek
5.7K
30 августа 2011 года
Lindemann66
193 / / 21.07.2011
Нет, у меня в файл вообще ничего не пишется
Код:
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";
    }
}
277
30 августа 2011 года
arrjj
1.7K / / 26.01.2011
qlogfile.h
Код:
#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

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();
    }
}
5.7K
30 августа 2011 года
Lindemann66
193 / / 21.07.2011
Ооо, крутой класс, я не ожидал)
Посмотрим, если нужно будет расширить свой, буду его использовать
Единственное, не нашёл место, где запись в файл то собственно происходит (не в консоль)
277
30 августа 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Lindemann66

Единственное, не нашёл место, где запись в файл то собственно происходит (не в консоль)



 
Код:
if(write(writestring.toUtf8())!=writestring.toUtf8().size())
5.7K
30 августа 2011 года
Lindemann66
193 / / 21.07.2011
Точно
14
30 августа 2011 года
Phodopus
3.3K / / 19.06.2008
Откройте уже для себя Logging фреймворки
277
30 августа 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Phodopus
Откройте уже для себя Logging фреймворки



Спасибо я в курсе существования log4j/cxx/qt , QxtLogger и Pantheios . Вопрос темы то был другой.

14
31 августа 2011 года
Phodopus
3.3K / / 19.06.2008
Да я ТС-у. Я смотрю он логгинг в итоге делает.
277
31 августа 2011 года
arrjj
1.7K / / 26.01.2011
Не ну если за всю работу программы надо всего там пару сообщений в лог вывести, то чтото большое и многофункциональное нет смысла использовать.
260
31 августа 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: arrjj
Не ну если за всю работу программы надо всего там пару сообщений в лог вывести, то чтото большое и многофункциональное нет смысла использовать.



Ну как-же: "logging is a platform". А по сему только могучий фреймворк спасет отцов русской демократии.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог