LINUX.ORG.RU

QTextStream не записывает в файл.

 ,


0

2

Для записи данных в файл я создал свой класс, внутри которого используется связка QFile + QTextStream. Объект этого класса помещается в отдельный поток при помощи QThread.

Проблема в том, что QTextStream не работает. То есть выражение вида:

MyTextStream << "Some text";
не пишет в файл, в то время как
MyFile.write("Some text");
работает как надо.

В чем причина? Мне нужна запись именно через QTextStream.

★★★

Ты код-то покажи. Создание экземпляров QFile, QTextStream, запись. Все необходимые операции

XMs ★★★★★
()
Ответ на: комментарий от CrossFire

Класс для работы с файлом:

class IOFile : public QObject
{
    Q_OBJECT
public:
    explicit IOFile(QObject *parent = 0) {
        file = new QFile(this);
        fileStream = new QTextStream(file);
    }
    ~IOFile();

private:
    QFile *file;
    QTextStream *fileStream;

public slots:
    void dataWrite(data_t data) {
        *fileStream << data << "\n";           //Так не работает
        file->write(QByteArray::number(data)); //А вот так все ок
    }

};

otto ★★★
() автор топика
Ответ на: комментарий от otto

Ну и создаю объект и перемещаю его в поток:

    iofile = new IOFile;
    iofile->moveToThread(&FileThread);
    FileThread.start();

otto ★★★
() автор топика

Скорее всего нужно перегрузить оператор «<<»

alchemist
()
Ответ на: комментарий от otto

Где задается имя файла? Где файл открывается?

    QFile *file = new QFile("data.txt");
    QTextStream *stream = new QTextStream(file);
    if (file->open(QIODevice::ReadWrite)) {
        *stream << "ta-dam!" << endl;
    }
CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)

В таком варианте у меня работает.

//iofile.h
#ifndef IOFILE
#define IOFILE

#include <QObject>
#include <QFile>
#include <QTextStream>

class IOFile : public QObject
{
    Q_OBJECT
public:
    explicit IOFile(QObject *parent = 0) : QObject(parent), file(new QFile("/home/wolph/test.txt", this))
    {
        file->open(QIODevice::WriteOnly);

        stream.setDevice(file);
    }

private:
    QFile *file;
    QTextStream stream;


signals:

public slots:
    void dataWrite(const QString &data) {
        stream << data;
    }
};

#endif // IOFILE



//main.cpp
#include <QCoreApplication>
#include <QThread>
#include <QTimer>

#include "iofile.h"



int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QThread thread;
    thread.start();

    IOFile iofile;
    iofile.moveToThread(&thread);

    QTimer timer1;
    timer1.setSingleShot(true);
    QObject::connect(&timer1, &QTimer::timeout, [&iofile](){
        QMetaObject::invokeMethod(&iofile, "dataWrite", Qt::QueuedConnection, Q_ARG(QString, QStringLiteral("test")));
    });

    QTimer timer2;
    QObject::connect(&timer2, &QTimer::timeout, &app, &QCoreApplication::quit);


    timer1.start(1000);
    timer2.start(2000);


    int ret = app.exec();

    thread.quit();
    thread.wait(1000);

    return ret;
}

anonymous
()
Ответ на: комментарий от CrossFire

Имя задаётся в конструкторе класса, открывается файл там же.

После того, как я создаю объект, я его перемещаю в новый поток. И там начинаются проблемы - QFile::write() работает, QTextStream - нет.

otto ★★★
() автор топика
Ответ на: комментарий от otto

Попробуй после записи вызвать FileStream->flush(). Можно сделать то же самое для файла, для гарантии

XMs ★★★★★
()

MyFile.write(«Some text»);

Сам же ответил на свой вопрос:
QTextStream::flush()
А вообще изучи теорию, потом код пиши. Что за мода без головы кодить кидаться. В соседнем треде быдлокодеры такими советами растят себе подобных.

erfea ★★★★★
()
void QTextStream::setDevice(QIODevice * device)

сдаётся мне, ты забыл это

WRG ★★★★
()
Ответ на: комментарий от anonymous

После того как указал явно

stream.setDevice(file);
все заработало. Правда, я все еще не понимаю, почему не работал мой вариант.

otto ★★★
() автор топика
Ответ на: комментарий от otto

Правда, я все еще не понимаю, почему не работал мой вариант.

Детские ошибки. Мог файл не открыть на запись...

erfea ★★★★★
()
Ответ на: комментарий от erfea

Учи матчасть, флаш небходим для гарантированной записи.

Из документации:

If QTextStream operates on a string, this function does nothing.

otto ★★★
() автор топика
Ответ на: комментарий от otto

If QTextStream operates on a string
void dataWrite(data_t data)

Это строка? А если понадобится не строку писать? А правила хорошего тона? Ах ну да, у быдлокодеров не принято допускать мысли о измении, сопровождении или повторном использовании кода. Нужно избегать всего что может облегчить дальнейшую жизнь всеми правдами и не правдами.
ЗЫ не пахало то почему, так и не разобрался? Файл на запись открывал до передачи в конструктор QTextStream?

erfea ★★★★★
()
Ответ на: комментарий от erfea

Почаще употребляй слово «быдлокодер». Может быть тогда никто не подумает, что ты — быдлокодер.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.