Russian Qt Forum
Ноябрь 25, 2024, 23:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QString  (Прочитано 5446 раз)
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);

Но при считывании получаю пустую строку.
Пожалуйста, помогите, подскажите как мне обойти данную проблему. Далее как проблема будет решена я буду уже размечать массив и писать его на диск.
Записан
ildar
Гость
« Ответ #1 : Сентябрь 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);
     }
Записан
shadone
Гость
« Ответ #2 : Сентябрь 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)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.122 секунд. Запросов: 20.