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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Алгоритм чтения из файла в динамический двумерный массив.  (Прочитано 25349 раз)
Ovoshlook
Гость
« : Июнь 05, 2011, 23:49 »

Здравствуйте все. Созрел такой вопрос.

У меня есть файл сданными. В этих данных числа. В каждой строке произвольное количество чисел. Собственно этими числами мне необходимо заполнить динамический двумерный массив где i элемент это номер строки в файле, а j элемент-это собственно число из i строки. на данный момент в файл числа записываются таким образом:

13010
240010015
3459987

В формировании массива вопросов не возникает, вопрос в другом:
Как мне лучше организовать запись этих чисел в файл чтобы потом можно было разделить числа между собой?
Как вариант я предполагал пробел между числами. но может быть его более интересный и правильный способ?

пока что чтобы не мучиться пусть числа будут одинарными(то есть двухзначных чисел не предвидится)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Июнь 06, 2011, 00:27 »

разделитель - пробел или табуляция, читать/писать через QTextStream (если нужен читабельный файл), количество разрядов в числе неважно, при чтении файла читать построчно и делить строку на числа через QString::split(" ") (или QString::split("\t") в случае табуляции)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ovoshlook
Гость
« Ответ #2 : Июнь 06, 2011, 08:20 »

Ну собственно как и думал)
А если например писАть/читать в/из бинарного файла? То таким же образом разделитель ставить? Или там свои и\есть как4ие то особенности?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #3 : Июнь 06, 2011, 11:44 »

там никаких разделителей не надо - просто читаешь/пишешь всё подряд через QDataStream
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ovoshlook
Гость
« Ответ #4 : Июнь 06, 2011, 11:59 »

а. ну все. я понял.  Он кодировать число будет в определенную длину бит и делить их по количеству бит.
Только тогда возникает вопрос: Как понять в какой стоке в массиве сколько должно быть чисел. в текстовом файле -это указатель конца строки будет. А в двоичном как определить?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #5 : Июнь 06, 2011, 12:22 »

дописывай первым числом в строке количество чисел в строке. либо если все числа одного типа, то можно просто в QList считывать.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Ovoshlook
Гость
« Ответ #6 : Июнь 06, 2011, 12:35 »

Спасибо) Все понял)
Записан
Ovoshlook
Гость
« Ответ #7 : Июнь 06, 2011, 13:07 »

и последний вопрос по файам)
QFile File("file.txt");
Где будет лежать этот файл?
Обыскал все. Найти нигде не могу.
Пишу с://file.txt и он замечательно находится в нужной директории. Где у него домашняя папка если я укажу просто file.txt? (по идее же должна ледать с исходниками проекта, но там я ничего не нахожу...)
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Июнь 06, 2011, 13:21 »

Там, где рабочая папка приложения.
Если запускаете из QtCreator'а, то Проекты>Настройка запуска>Рабочий каталог.
Записан
Ovoshlook
Гость
« Ответ #9 : Июнь 06, 2011, 14:13 »

всем большое спасибо за терпение и ответы на мои вопросы!)
Записан
Ovoshlook
Гость
« Ответ #10 : Июнь 09, 2011, 14:18 »

Опять вопрос по файлам назрел. Нужно считать из файла *.dat данные в динамический массив. я записываю данные туда таким образом
Код:
 for (int i=0; i<GlobalVaribles::all.size(); i++)
        {
            for (int j=0; j<GlobalVaribles::all[i].size();j++)
                out1 << GlobalVaribles::all[i][j];
         out1<<endl;
        }

То есть считываю столбец двумерного вектора в одну строку файла,
Затем ставлю метку конца строки.

Теперь, мне нужно считать из файла обратно в вектор. Как мне определить количество строк в файле?

Или endl не будет читаться при записи в бинарник?
« Последнее редактирование: Июнь 09, 2011, 14:29 от Ovoshlook » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #11 : Июнь 09, 2011, 14:41 »

Читаться то он будет, только нет гарантии, что просто в своих числах вы его нигде не встретите.

Показывайте, что такое out1 и GlobalVaribles::all (объявление и инициализацию).
Записан
Ovoshlook
Гость
« Ответ #12 : Июнь 09, 2011, 15:05 »

 QDataStream out1(&file1);
GlobalVaribles::all- двумерный вектор
GlobalVaribles::all -строка с индексом i
GlobalVaribles::all[j] - i элемент под номером  [j]


 Вроде бы сам разобрался) Не стал вымудряться. Убрал endl. Благо у меня в векторе хранятся данные на основе которых я могу знать сколько элементов у меня в каждой строке должно быть. Так и вышел из положения. Но сам вопрос остается , только условие немного поменяется теперь:
Так же еще у меня есть строковый массив ()
std::vector <std::vector<QString> > MyVector.

Записываю данные я из него так:
Код:
QFile file2("Text.txt");
    file2.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text);
    QTextStream out2(&file2);
    for (int i=0; i<GlobalVaribles::QuestionAndAnswer.size(); i++)
        {
        for (int j=0; j<GlobalVaribles::QuestionAndAnswer[i].size();j++)
            out2 << GlobalVaribles::QuestionAndAnswer[i][j]<<endl;
        }
    file2.close();


Алгоритм того как записать в него обратно данные я знаю, остается только один технический вопрос. Есть ли специальная функция у QFile
которая в текстовом файле может определить конец строки.

Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #13 : Июнь 09, 2011, 15:26 »

QDataStream out1(&file1);
GlobalVaribles::all- двумерный вектор
std::vector <std::vector<QString> > MyVector.
Если будете использовать Qt-шные вектора (QVector), то можно будет писать просто
out << myVector;
in >> myVector;

Даже если он двумерный. См. в справке Serializing Qt Data Types.
P.S. Я понимаю, что иногда надо неиспользовать Qt-шные типы для стыковки с другими сишными модулями, но std::vector <std::vector<QString> > - это какая-то солянка. Либо std::vector < std::vector< std::string > >, либо QVector < QVector< QString > >, imho.

Есть ли специальная функция у QFile
которая в текстовом файле может определить конец строки.
Можно читать по строкам при помощи readLine/readLineData.
Записан
Denjs
Гость
« Ответ #14 : Июнь 09, 2011, 15:29 »

и последний вопрос по файам)
QFile File("file.txt");
Где будет лежать этот файл?
в текущей рабочей папке.
Что бы не было разночтений или непонимания, я вот всегда стараюсь пользоваться каталогом бинарника как точкой отсчета для всех моих относительных путей - и, как правило, с помощью ряда функций(часть из них см ниже) формирую для открытия файла "полный путь с именем" - что бы не было разночтений или подозрений в том как оно отработает.

каталог бинарника вы получите через
Код:
QString QCoreApplication::applicationDirPath () [static]

если нужен текущий рабочий каталог - что бы из него обработать файлы (например вам передали в программу имя файла где-то там где сейчас пользователь) то смотрите
Код:
QString QDir::currentPath () [static]

и, кстати, есть ещё
Код:
QString QDir::tempPath () [static]
QString QDir::homePath () [static]
QString QDir::rootPath () [static]
« Последнее редактирование: Июнь 09, 2011, 15:33 от Denjs » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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