Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: M9yT от Ноябрь 24, 2010, 22:24



Название: Проблемы с чтением/записью
Отправлено: M9yT от Ноябрь 24, 2010, 22:24
Привет всем.
Пытаюсь сохранить в файл объекты некоторого класса(поле int и QString), используя для этого структуру типа
Код:
struct zap_adrs{
        int id;
        char adrs[50];
};
QString заменил char, т.к. вроде есть проблемы с записью этого типа.
Проблема в том, что после считывания у меня вместо русских символов отображаются "????".
Запись:

ID - абстрактный класс, пример упростил просто.
Код:
void WriteAddress(ID &ob, QFile &f)
{
        address *w;
        zap_adrs A;
        w=(address*)(&ob);
        A.id=w->get_id(); //возвращает значение одного из полей
        strcpy(A.adrs, w->get_name().toAscii());      //копирую в структуру другое поле
        f.write((char*)&A, sizeof(A));
}
Код:
void Programm::SaveToFile()
{
    QFile file("data.dat");
    WriteAddress(*(collection->at(0)), file);   //collection - это QVector< ID* >
    file.close();
}

Считывание:
Код:
void Programm::LoadFromFile()
{
    if(collection->size()!=0)
            collection->clear();
            QFile f("data.dat");
            zap_adrs A;
            address *a;
            f.read((char*)&A, sizeof(A));
            a=new address(A.id, A.adrs);
            collection->push_back(a);
            f.close();
}
Теперь в A.adrs закорючки.


Название: Re: Проблемы с чтением/записью
Отправлено: BRE от Ноябрь 24, 2010, 22:28
Посмотри на QDataStream.


Название: Re: Проблемы с чтением/записью
Отправлено: M9yT от Ноябрь 24, 2010, 22:29
Посмотри на QDataStream.

В QDataStream не перегружен оператор << для моего класса.


Название: Re: Проблемы с чтением/записью
Отправлено: BRE от Ноябрь 24, 2010, 22:31
В QDataStream не перегружен оператор << для моего класса.
Перегрузи или просто пиши/читай нужные поля своей структуры.


Название: Re: Проблемы с чтением/записью
Отправлено: M9yT от Ноябрь 24, 2010, 22:34
В QDataStream не перегружен оператор << для моего класса.
Перегрузи или просто пиши/читай нужные поля своей структуры.

Ок, сейчас попробую.


Название: Re: Проблемы с чтением/записью
Отправлено: M9yT от Ноябрь 24, 2010, 22:39
Тогда еще вопрос, писать char или QString можно?


Название: Re: Проблемы с чтением/записью
Отправлено: BRE от Ноябрь 24, 2010, 22:41
Тогда еще вопрос, писать char или QString можно?
QString


Название: Re: Проблемы с чтением/записью
Отправлено: M9yT от Ноябрь 24, 2010, 22:46
Тогда еще вопрос, писать char или QString можно?
QString

Просто когда я на VS делал то же самое в консоли, там при многократной записи String блоками ошибка появлялась.
Может здесь также?


Название: Re: Проблемы с чтением/записью
Отправлено: BRE от Ноябрь 24, 2010, 22:47
Что значит:
...многократной записи String блоками...


Название: Re: Проблемы с чтением/записью
Отправлено: M9yT от Ноябрь 24, 2010, 22:58
Что значит:
...многократной записи String блоками...

Ну не обязательно блоками, например:
fstream f("mycourse.txt", ios::out|ios::binary);
f.write((char*)&A, sizeof(A));
где структура А имеет поле String.


Название: Re: Проблемы с чтением/записью
Отправлено: Igors от Ноябрь 25, 2010, 00:17
f.write((char*)&A, sizeof(A));
Это не будет работать для классов-объектов. Запрягайте QDataStream и операторы << и >>. Все равно придется, поэтому чем раньше - тем лучше


Название: Re: Проблемы с чтением/записью
Отправлено: merke от Ноябрь 25, 2010, 03:47
http://qt.ucoz.net/blog/zapis_struktury_polzovatelskogo_tipa_v_fajl/2010-11-16-104