crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QString и QDataStream
Hardcode
  опции профиля:
сообщение 3.4.2011, 23:03
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 3.4.2011
Пользователь №: 2569

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Создал новый тест-проект, вот код:
#include <QApplication>
#include <QFile>
#include <QDataStream>
#include <QString>
#include <QDebug>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QFile output("output.bin");
    output.open(QIODevice::WriteOnly);

    QDataStream fileStream(&output);
    fileStream.setVersion(QDataStream::Qt_4_7);
    fileStream << QString("Test string");

    if (fileStream.status() != QDataStream::Ok)
        qDebug() << "Error while writing file";

    return app.exec();
}


Результат работы программы - файл output.bin размером 0 байт. Сообщения об ошибке не возникало.
Кто-нибудь сталкивался с подобным? Или, может быть, в коде что-то упущено?

Система: Linux x86_64, GCC 4.6.0, Qt 4.7.2
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 4.4.2011, 8:16
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Попробуй так:
    QDataStream fileStream(&output);
    fileStream.setVersion(QDataStream::Qt_4_7);
    fileStream << QString("Test string");

    if (fileStream.status() != QDataStream::Ok)
        qDebug() << "Error while writing file";

    fileStream.flush();
    output.close();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 4.4.2011, 11:39
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


во-первых, как ты завершаешь своё приложение?
я сунул твой код в конструктор окна, и код отработал.
я скомпилировал твой код, как он есть, и строка не записалась.
затем я добавил - output.close();
запись произошла.
почему? мне приходит в голову, что в первом случае (код в конструкторе класса) по выходе из конструктора объект QFile output удаляется, предварительно закрывая файл - изменения вносятся.
А во втором случае твоя программа не завершается, QFile output нигде не удаляется, файл остаётся открытым, изменения не вносятся
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Hardcode
  опции профиля:
сообщение 4.4.2011, 14:17
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 3.4.2011
Пользователь №: 2569

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да, действительно, проблема исчезла после вызова output.close().

Цитата(abc @ 4.4.2011, 11:39) *
как ты завершаешь своё приложение?

В этом-то и дело. Завершал из консоли по Ctrl+C, забыв, что в этом случае деструктор не будет вызван и буфер не сохранится на диске.
Но ведь, что самое интересное, абсолютно тот же подход у меня работал в случае QPixmap ^_^
Вопрос решен, спасибо за советы :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 4.4.2011, 14:31
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


да, правда, при завершении программы QPixmap записывается
объяснить не могу :sad2:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.8.2020, 15:44