crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> контейнер вектор записать в файл, помощь по Qt4
registr
  опции профиля:
сообщение 16.11.2009, 18:48
Сообщение #1


Участник
**

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

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




Репутация:   1  


Помогите пожалуйста, не знаю как записать в файл вектор а:

QVector<float> a;
// далее определяю a

// помогите дальше записать его в файл, например, в file.txt

QVector<float> b;
// а потом считать с него в вектор b
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.11.2009, 18:57
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


QFile* file; /* где-то определено и инициализировано */

QTextStream out(file);

for(int i=0; i<a.size(); ++i) /// запись
   out << a[i]  << " ";

Чтение очень похоже. Попытайтесь сами.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.11.2009, 19:02
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


в TXT, только поштучно руками сохранять. Если же просто в файл, то смотри QDataStream, он поддерживает QVector
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 16.11.2009, 19:03
Сообщение #4


Участник
**

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

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




Репутация:   1  


Спасибо, попробую сегодня. Чтение аналогично, только через in >> ... ?

В STL (а может я путаю?) есть фунции
#include <stdio.h> 

/* vecprint: выводит вектор v длины n в файл ofp */
int *vecprint(int *v, int n, FILE *ofp)
{
    while (n--)
        fprintf(ofp, " %d%s",
            *v++, (n == 0 ? "\n" : ""));
    return ferror(ofp) ? NULL : v;
}

и
#include <stdio.h> 

/* vecfill:  заполняет вектор v длины n данными из файла ifp */
int *vecfill(int *v, int n, FILE *ifp)
{
    int *vp;
    
    for (vp = v; n > 0 && fscanf(ifp, "%d", vp++) == 1; n--)
       ;
    return ferror(ifp) ? NULL : v;    
}


Есть ли подобноее в Qt4? (только что нашел, еще не пробовал, но может и под Qt4 функции эти пойдут)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 16.11.2009, 19:26
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Ну тут резонный задан вопрос. Файл текстовый? Если текстовый, то так, как я показал, будет запись. Чтение - почти также, но немного похитрее. Попробуйте сами.

Если файл бинарный, то вместо QTextStream использовать QDataStream. А он поддерживает вектора. И можно будет сделать строчками:
QDataStream out(file);

out << a;   ///< запись

QDataStream in(file);

in >> b;   ///< чтение


Сообщение отредактировал AD - 16.11.2009, 19:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 16.11.2009, 19:32
Сообщение #6


Участник
**

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

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




Репутация:   1  


Большое спасибо! :clapping: :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 16.11.2009, 23:44
Сообщение #7


Участник
**

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

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




Репутация:   1  


Методом проб и ошибок удалось записать вектор в файл. Вот:
#include<QIODevice>

...

QVector<float> A;
// определяю A


чтобы сохранить в текстовый файл file.txt
QFile file("file.txt"); 
file.open(QIODevice::WriteOnly); // нужно обязательно открыть файл и указать для чего(!)
QTextStream out(&file);
for(int i=0; i< A.size(); i++) // запись
out << A[i]  << " ";
file.close();  // нужно обязательно закрыть файл(!)


чтобы сохранить в бинарный файл file.bin сразу весь вектор
QFile file("file.bin"); 
file.open(QIODevice::WriteOnly); // нужно обязательно открыть файл и указать для чего(!)
QDataStream out(&file);
out << A;   // запись
file.close(); // нужно обязательно закрыть файл(!)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.11.2009, 23:58
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(registr @ 17.11.2009, 2:44) *
file.close(); // нужно обязательно закрыть файл(!)
нет не обязательно, если переменная локальная, т.к.:
Цитата
QFile::~QFile ()
Destroys the file object, closing it if necessary.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 17.11.2009, 18:49
Сообщение #9


Участник
**

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

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




Репутация:   1  


Вообщем да. Если файл нигде дальше открываться не будет заново, то его можно не закрывать.

Вдруг кому-нибудь еще пригодиться:
// #include<QIODevice>
// ...
QVector<float> A1;
// определяю вектор A1
//...
// записываю вектор A1 в текстовый файл
QFile file1("file.txt");
file1.open(QIODevice::WriteOnly);
QTextStream out1(&file1);
for (int i=0; i<A1.size(); i++)
out1 << A1[i]  << "\n"; // запишется в столбик
file1.close();
// ...    
// записываю вектор  A1 в бинарный файл
QFile file2("file.dat"); // можно также в "file.bin"
file2.open(QIODevice::WriteOnly);
QDataStream out2(&file2);
out2 << A1;
file2.close();
//...
QVector<float> A2;
// считываю из текстового файла в вектор A2
QString str;
file1.open(QIODevice::ReadOnly);
QTextStream in1(&file1);
while (!file1.atEnd())
{
   str = in1.readLine();
   A2.push_back(str.toFloat());
}
// ...
QVector<float> A3;
// считываю из бинарного файла в вектор A3
file2.open(QIODevice::ReadOnly);  
QDataStream in2(&file2);
in2 >> A3;
//...

:rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 17.11.2009, 22:19
Сообщение #10


Участник
**

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

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




Репутация:   1  


Цитата
QFile file1("file.txt");
file1.open(QIODevice::WriteOnly);
QTextStream out1(&file1);
for (int i=0; i<A1.size(); i++)
out1 << A1[i] << "\n"; // запишется в столбик
file1.close();

QString str;
file1.open(QIODevice::ReadOnly);
QTextStream in1(&file1);
while (!file1.atEnd())
{
str = in1.readLine();
A2.push_back(str.toFloat());
}

Такой способ записи и считывания оказался глючным. AD, а какой предлагали Вы? Бьюсь, никак не получается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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