Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Сентябрь 29, 2009, 10:29



Название: QString
Отправлено: merke от Сентябрь 29, 2009, 10:29
Всем привет! Я тут пишу лабку, мне нужно записать массив QString в бинарный файл и потом его так же считать. Задание не использовать QDataStream. Т.е. перед записи массива на диск я сам буду его размечать, а потом уже записывать, это всё делается для того чтобы потом можно было эти базы читать в любой среде программирвоания. Так вот беру создаю массив QString my[0] к примеру.
Привожу код:

Код:
QString my[0];
    my[0].push_back("Alex");
     QFile file;
     file.setFileName("C:\\dev.dat");
     file.open(QIODevice::WriteOnly);
     file.write((char*)&my[0],4);

Аналогично считываю:

Код:
QString my[0];
     //my[0].push_back("Alex");
     QFile file;
     file.setFileName("C:\\dev.dat");
     file.open(QIODevice::WriteOnly);
     file.read((char*)&my[0],4);

Но при считывании получаю пустую строку.
Пожалуйста, помогите, подскажите как мне обойти данную проблему. Далее как проблема будет решена я буду уже размечать массив и писать его на диск.


Название: Re: QString
Отправлено: ildar от Сентябрь 29, 2009, 10:44
как минимум:
пишешь и пытаешься читать только первые 4  байта

Код:
...
file.write((char*)&my[0],4);
...

и при чтении указываешь не правильный режим

Код:
file.open(QIODevice::WriteOnly);


самый простой вариант сохрянять каждый элемент массива на отдельной строке, в асситанте даже пример есть как читать текстовый файл по строкам:
Код:
     QFile file("in.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;

     while (!file.atEnd()) {
         QByteArray line = file.readLine();
         process_line(line);
     }


Название: Re: QString
Отправлено: shadone от Сентябрь 29, 2009, 12:13
Всем привет! Я тут пишу лабку, мне нужно записать массив QString в бинарный файл и потом его так же считать. Задание не использовать QDataStream. Т.е. перед записи массива на диск я сам буду его размечать, а потом уже записывать, это всё делается для того чтобы потом можно было эти базы читать в любой среде программирвоания. Так вот беру создаю массив QString my[0] к примеру.
Привожу код:

Код:
QString my[0];
    my[0].push_back("Alex");
     QFile file;
     file.setFileName("C:\\dev.dat");
     file.open(QIODevice::WriteOnly);
     file.write((char*)&my[0],4);

Аналогично считываю:

Код:
QString my[0];
     //my[0].push_back("Alex");
     QFile file;
     file.setFileName("C:\\dev.dat");
     file.open(QIODevice::WriteOnly);
     file.read((char*)&my[0],4);

Но при считывании получаю пустую строку.
Пожалуйста, помогите, подскажите как мне обойти данную проблему. Далее как проблема будет решена я буду уже размечать массив и писать его на диск.

wtf?
Зачем там массив QString нулевой длины? (насколько я помню, это фишка C, и в C++ не будет работать в некоторых компиляторах).

по существу вопроса - читать/писать объекты таким образом нельзя! Так можно обращаться только с POD (Plain Old Data) типами, и то могут быть проблемы из-за выравнивания полей.
Плюс QString кроме собственно строки содержит еще служебные данные (такие как reference count и т.п.).
В данном случае надо описать свою структуру файла и заполнять ее вручную, взяв только содержимое строки QString - длину (QString::length) и данные (QString::utf16 или QString::unicode)