crossplatform.ru

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


  Ответ в контейнер вектор записать в файл
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 18.11.2009, 18:09
 
Цитата(registr @ 18.11.2009, 16:35) *
здесь фишка в том, что число записывается в num, а символ "пробела" в sym и все это прогоняется до конца файла. Но ошибка возникает в строчке: (in1 >> num >> char;) Видимо, он пытается считать сразу весь файл, а как ему задать, чтобы считал сначала число, символ, потом, число, символ, и т.д. по циклу?

Блин, я нифига не понял из этого текста!

При открытии файла НЕОБХОДИМО указывать как его следует открывать. Т.е. Вы открываете файл без лишних указаний (по-умолчанию, как бинарный), а читать пытаетесь как текстовый. Это первое, что бросается в глаза. Надо указывать флаг QIODevice::Text!
Второе, насколько я помню, знак переноса строки используется вместе с возвратом каретки (по крайней мере, в данном случае). Поэтому лучше писать или так "\r\n", или так endl!
registr Дата 18.11.2009, 16:35
  Спасибо, попрубую сегодня с этим кодом.

Вот была еще такая идея считывания, где числа записывались через пробел в текстовый файл:

// ...
float num;
char sym;

QFile file1("file.txt"); 
file1.open(QIODevice::ReadOnly);
QTextStream in1(&file1);
while (!file1.atEnd())
{
   in1 >> num >> char;
   A2.push_back(num);
}

здесь фишка в том, что число записывается в num, а символ "пробела" в sym и все это прогоняется до конца файла. Но ошибка возникает в строчке: (in1 >> num >> char;) Видимо, он пытается считать сразу весь файл, а как ему задать, чтобы считал сначала число, символ, потом, число, символ, и т.д. по циклу?
AD Дата 18.11.2009, 13:35
  Ну есть замечания по поводу кода. Поправил немного. Обратите внимания на параметры, с которыми файл открывается. Взял кусок кода, относящиеся только к QTextStream
// #include<QIODevice>
// ...
QVector<float> A1;
// определяю вектор A1
//...
// записываю вектор A1 в текстовый файл
QFile file1("file.txt"); 
file1.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
QTextStream out1(&file1);
for (int i=0; i<A1.size(); i++)
out1 << A1[i]  << endl; // запишется в столбик
file1.close(); 
// ...     

//...
QVector<float> A2;
// считываю из текстового файла в вектор A2
QString str;
file1.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream in1(&file1);
while (!file1.atEnd())
{
   str = in1.readLine().simplified();
   A2.append(str.toFloat()); 
} 
//...

Также обратите внимание, что при чтении строки я убираю лишние пробелы. Потом лучше перевод из строки в число делать с проверкой вот так:
while (!file1.atEnd())
{
   bool ok = false;
   str = in1.readLine().simplified();
   float f = str.toFloat(&ok);
   if(ok) A2.append(f); 
} 
//...
registr Дата 18.11.2009, 11:46
  В векторе порядка 50000 чисел, но может быть и больше. Каждое число я записываю с новой строки в файл. Во-первых, возникает проблема с переводом строки "\n" на последнем элементе вектора, когда он записывает его и переводит строку, но она пустая. Из-за возникают глюки. Если число элементов вектора меньше 11 (я брал 0 1 2 3 4 5 6 7 8 9), то программа катагорически отказывается их записывать, вместо них записывает символы-квадратики. Если число элементов вектора больше 10, то все нормально записывается. Это очень странно. Я поставил условие, чтобы при записи последнего элемента не было перевода строки, программа заработала и для числа элементов меньше 11. Но это еще полбеды. При считывании из такого файла с помощью
str = in1.readLine();
A2.push_back(str.toFloat());
теряются некоторые элементы моего вектора, в котором 50000 чисел. В простом же случае, когда просто беру 0 1 2 3 4 5 6 7 8 9 числа вообще не считываются.

А есть ли более простой способ считать числа из текстового файла?
AD Дата 17.11.2009, 22:35
 
Цитата(registr @ 17.11.2009, 22:19) *
Такой способ записи и считывания оказался глючным. AD, а какой предлагали Вы? Бьюсь, никак не получается.

Что понимается под словом "глючный"? Какие конкретно проблемы? Какой размер вектора?
registr Дата 17.11.2009, 22:19
 
Цитата
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, а какой предлагали Вы? Бьюсь, никак не получается.
registr Дата 17.11.2009, 18:49
  Вообщем да. Если файл нигде дальше открываться не будет заново, то его можно не закрывать.

Вдруг кому-нибудь еще пригодиться:
// #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:
Litkevich Yuriy Дата 16.11.2009, 23:58
 
Цитата(registr @ 17.11.2009, 2:44) *
file.close(); // нужно обязательно закрыть файл(!)
нет не обязательно, если переменная локальная, т.к.:
Цитата
QFile::~QFile ()
Destroys the file object, closing it if necessary.
registr Дата 16.11.2009, 23:44
  Методом проб и ошибок удалось записать вектор в файл. Вот:
#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(); // нужно обязательно закрыть файл(!)

registr Дата 16.11.2009, 19:32
  Большое спасибо! :clapping: :rolleyes:
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 16:52