crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> контейнер вектор записать в файл, помощь по Qt4
AD
  опции профиля:
сообщение 17.11.2009, 22:35
Сообщение #11


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

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

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




Репутация:   17  


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

Что понимается под словом "глючный"? Какие конкретно проблемы? Какой размер вектора?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
registr
  опции профиля:
сообщение 18.11.2009, 11:46
Сообщение #12


Участник
**

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

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




Репутация:   1  


В векторе порядка 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
  опции профиля:
сообщение 18.11.2009, 13:35
Сообщение #13


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

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

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




Репутация:   17  


Ну есть замечания по поводу кода. Поправил немного. Обратите внимания на параметры, с которыми файл открывается. Взял кусок кода, относящиеся только к 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, 16:35
Сообщение #14


Участник
**

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

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




Репутация:   1  


Спасибо, попрубую сегодня с этим кодом.

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

// ...
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, 18:09
Сообщение #15


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

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

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




Репутация:   17  


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

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

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

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


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




RSS Текстовая версия Сейчас: 22.10.2019, 7:23