Название: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 05, 2011, 23:49 Здравствуйте все. Созрел такой вопрос.
У меня есть файл сданными. В этих данных числа. В каждой строке произвольное количество чисел. Собственно этими числами мне необходимо заполнить динамический двумерный массив где i элемент это номер строки в файле, а j элемент-это собственно число из i строки. на данный момент в файл числа записываются таким образом: 13010 240010015 3459987 В формировании массива вопросов не возникает, вопрос в другом: Как мне лучше организовать запись этих чисел в файл чтобы потом можно было разделить числа между собой? Как вариант я предполагал пробел между числами. но может быть его более интересный и правильный способ? пока что чтобы не мучиться пусть числа будут одинарными(то есть двухзначных чисел не предвидится) Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 06, 2011, 00:27 разделитель - пробел или табуляция, читать/писать через QTextStream (если нужен читабельный файл), количество разрядов в числе неважно, при чтении файла читать построчно и делить строку на числа через QString::split(" ") (или QString::split("\t") в случае табуляции)
Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 06, 2011, 08:20 Ну собственно как и думал)
А если например писАть/читать в/из бинарного файла? То таким же образом разделитель ставить? Или там свои и\есть как4ие то особенности? Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 06, 2011, 11:44 там никаких разделителей не надо - просто читаешь/пишешь всё подряд через QDataStream
Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 06, 2011, 11:59 а. ну все. я понял. Он кодировать число будет в определенную длину бит и делить их по количеству бит.
Только тогда возникает вопрос: Как понять в какой стоке в массиве сколько должно быть чисел. в текстовом файле -это указатель конца строки будет. А в двоичном как определить? Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 06, 2011, 12:22 дописывай первым числом в строке количество чисел в строке. либо если все числа одного типа, то можно просто в QList считывать.
Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 06, 2011, 12:35 Спасибо) Все понял)
Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 06, 2011, 13:07 и последний вопрос по файам)
QFile File("file.txt"); Где будет лежать этот файл? Обыскал все. Найти нигде не могу. Пишу с://file.txt и он замечательно находится в нужной директории. Где у него домашняя папка если я укажу просто file.txt? (по идее же должна ледать с исходниками проекта, но там я ничего не нахожу...) Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: LisandreL от Июня 06, 2011, 13:21 Там, где рабочая папка приложения.
Если запускаете из QtCreator'а, то Проекты>Настройка запуска>Рабочий каталог. Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 06, 2011, 14:13 всем большое спасибо за терпение и ответы на мои вопросы!)
Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 09, 2011, 14:18 Опять вопрос по файлам назрел. Нужно считать из файла *.dat данные в динамический массив. я записываю данные туда таким образом
Код: for (int i=0; i<GlobalVaribles::all.size(); i++) То есть считываю столбец двумерного вектора в одну строку файла, Затем ставлю метку конца строки. Теперь, мне нужно считать из файла обратно в вектор. Как мне определить количество строк в файле? Или endl не будет читаться при записи в бинарник? Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: LisandreL от Июня 09, 2011, 14:41 Читаться то он будет, только нет гарантии, что просто в своих числах вы его нигде не встретите.
Показывайте, что такое out1 и GlobalVaribles::all (объявление и инициализацию). Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 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"); Алгоритм того как записать в него обратно данные я знаю, остается только один технический вопрос. Есть ли специальная функция у QFile которая в текстовом файле может определить конец строки. Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: LisandreL от Июня 09, 2011, 15:26 QDataStream out1(&file1); Если будете использовать Qt-шные вектора (QVector), то можно будет писать простоGlobalVaribles::all- двумерный вектор std::vector <std::vector<QString> > MyVector. 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.которая в текстовом файле может определить конец строки. Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Denjs от Июня 09, 2011, 15:29 и последний вопрос по файам) в текущей рабочей папке.QFile File("file.txt"); Где будет лежать этот файл? Что бы не было разночтений или непонимания, я вот всегда стараюсь пользоваться каталогом бинарника как точкой отсчета для всех моих относительных путей - и, как правило, с помощью ряда функций(часть из них см ниже) формирую для открытия файла "полный путь с именем" - что бы не было разночтений или подозрений в том как оно отработает. каталог бинарника вы получите через Код: QString QCoreApplication::applicationDirPath () [static] если нужен текущий рабочий каталог - что бы из него обработать файлы (например вам передали в программу имя файла где-то там где сейчас пользователь) то смотрите Код: QString QDir::currentPath () [static] и, кстати, есть ещё Код: QString QDir::tempPath () [static] Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 15:30 в контейнерах для считывания элемента лучше использовать at() вместо []
std::vector <std::vector<QString> > MyVector - это явно не строковый массив, а строковая матрица :) Есть ли специальная функция у QFile зачем это нужно? QFile и QTextStream могут читать файл построчно функцией readLine()которая в текстовом файле может определить конец строки. Цитата: LisandreL Можно читать по строкам при помощи readLine/readLineData. readLineData - защищённый методНазвание: Re: Алгоритм чтения из файла в динамический д Отправлено: Ovoshlook от Июня 09, 2011, 15:50 Ну мне пока что не принципиально какие векторы использовать. Просто больше склоняюсь к стандартным вообще и в принципе (QFile не исключение, просто что первое было то и взял :), впринципе работа достаточно понятна и проста))
ну с std::vector <std::vector<QString> > конечно интересно получилось) Сам сначала незаметил) Но сейчас уже переделывать не будуно на будущее возьму на заметку) по поводу методов: Вроде бы как они возвращают только длину строки.. или я ошибаюсь? Пока писАл свое сообщение столько ответов )) Спасибо всем что помогаете) Цитировать td::vector <std::vector<QString> > MyVector - это явно не строковый массив, а строковая матрица Ну как бе да)) Тпропустил слово многомерный)Цитировать зачем это нужно? QFile и QTextStream могут читать файл построчно функцией readLine() Мне нужно определенным элементам массива присваивать определенные строки считанные из файла по определенному алгоритму. поэтому нужно каким либо образом получить доступ к конкреным строкам. Пусть последовательно, но в итоге это должно работать вот так:Код: MyVector [i][j]=1 строка файла. Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 09, 2011, 19:53 Ну и еще один вопрос. Если не сложно ответьте.
Ка определить конец текстового файла кроме QFile::atEnd? Просто при конструкции Код: int j=0; Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: BRE от Июня 09, 2011, 20:14 Что бы дойти до конца файла, нужно как минимум читать из него (файла).
Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 09, 2011, 20:19 Вот это работает без нареканий:
Код:
А вот это уходит в зависание: Код: QFile file2("Text.txt"); Кстати когда исправил на while (in2.readLine!=NULL) ситуация повторилась.. При чем in2.readAll; работает замечательно и показывает файл. Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 20:37 по-хорошему надо писать
Код
далее: зачем ты создаешь файловые потоки, если ими даже не пользуешься? как тебе правильно сказали, Что бы дойти до конца файла, нужно как минимум читать из него (файла). мало ли почему первый код работает, а второй - нет (кстати сколько раз выводится i - столько, сколько символов в файле?). лучше этим не пользоваться.Цитировать Кстати когда исправил на while (in2.readLine!=NULL) скорее уж while (!in2.readLine().isNull())Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 09, 2011, 20:51 Цитировать далее: зачем ты создаешь файловые потоки, если ими даже не пользуешься? Не. я ими пользуюсь. просто сейчас для дебага поставил именно счетчик j. На самом деле тело цикла while несколько иное. Но не в его содержании дело (как показывает дебаг, даже если просто j поставить все равно исход тот же)Сейчас попробую поймать ошибку открытия файла через if. Но опять же. я вместо цикла просто поставил QString str= in2.readAll; qDebug()<<str; И содержимое файла выводится.... Та что в открытии файла я не сомневаюсь, хотя не спорю что if else полезная штука. Попробывал с if else. Ошибки открытия файла не обнаружилось... Совсем непонятно почему так... Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 21:12 ты покажи свой реальный цикл для чтения файла, а не какой-то надуманный
Название: Re: Алгоритм чтения из файла в динамический д Отправлено: Ovoshlook от Июня 09, 2011, 21:16 Код:
Ну собственно если я комментб тело цикла и оставляю только ++j и его дебаг то ситуация не меняется. Такое ощущение что сам файл он читает, но он какой то бездонный получается или очень большой. Хотя в свойствах 2 килобайта весит... Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 21:32 не совсем понятно зачем нужен режим QIODevice::Truncate для чтения файла
readLine() читает строку и переходит к следующей - у тебя некоторые строки (которые попадают как раз в условие внешнего цикла) пропускаются (хотя может так и задумано - может там разделитель какой стоит) во внутреннем цикле условие вообще песня - оно всегда истинно. неудивительно, что файл тебе кажется бездонным :) и опять эти ресайзы вектора... неужто без них вообще никак не обойтись? :) да, и пример входного файла еще неплохо было бы увидеть Название: Re: Алгоритм чтения из файла в динамический д Отправлено: Ovoshlook от Июня 09, 2011, 21:46 Да. Строки должны пропускаться. Они потом заполняются во внутреннем цикле. Внутренний цикл всегда и должен быть истиным. Он работает от 1 и до значения другого вектора. Без ресайзов к сожалению никак... Вектор изменяет свой размер динамически в зависимости от того сколько элементов мне нужно....
Тест файла: Код: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> Собственно как я уже говорил, если я уберу тело цикла и оставлю один только счетчик ситуация не поменяется... Сейчас попробывал заполнить текстовый файл не через toHtml а через toPlainText. ситуация не изменилась к сожалению... toPlainText Использовать конечно правильнее все таки будет... Но тем не менее.. Сам цикл почему то не работает... Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 22:00 какой интересный у тебя файл - содержит сразу аж 5 полноценных хмтлок :)
насколько я понимаю, это тупо содрано из содержимого QTextEdit. реально нужен именно такой вид файла? из нужных данных я тут вижу аж по одному слову из каждой хтмлки - как раз перед закрытием тега параграфа. каждое слово можно просто установить в QTextEdit, а свой стандартный стиль (большая часть твоего входного файла) он и так выставит. что-то мне подсказывает, что то, что ты хочешь сделать тут, делается в разы проще... Название: Re: Алгоритм чтения из файла в динамический д Отправлено: Ovoshlook от Июня 09, 2011, 22:22 Ну да. Оттуда и содран. Про стили так уже и понял, поэтому сдираю его теперь оттуда с помощью toPlainText().
проще это как? Просто текст из файла должен загоняться в разные TextEdit'ы по определенным правилам. поэтому я загоняю этот текст в вектор, по как раз тем правилам. В итоге я получу структурированный по опять таки этим правилам :) набор строк, который пото прегоню во много много эдитов... Собственно поэтому я и читаю файл построчно... Может есть какие нибудь идеи почему файл может так зацикливаться при чтении? И огромное вам спасибо за советы и терпение ко мне) Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 22:29 про зацикливание я уже писал, читай внимательнее
во внутреннем цикле условие вообще песня - оно всегда истинно. неудивительно, что файл тебе кажется бездонным :) Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 09, 2011, 22:34 Если убераю вообще все тело цикла while ситуация не меняется...
То есть если я оставлю только while (!file2.atEnd()) { ++j; qDebug()<<j; } Зависание все равно происходит. Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 22:39 это ж уже обсуждалось - надо читать файл чтоб он достиг конца, а тут указатель на позицию файла не меняется (всегда в начале находится)
Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Ovoshlook от Июня 09, 2011, 22:54 а. Вы про цикл While говорили мне? Я думал внутренний цикл -это который как раз таки for который находится внутри while.
Тогда почему у меня с файлом dat такое проходит??? Код: QFile file1("Test.dat"); В нем все читается и все работает... Выгружаются все нужные мне данные по нужным правилам.. В первом посте у меня условие цикла было таким: Код: QFile file2("Text.txt"); Но результат точно такой же был. Так понимаю вы имеете ввиду то, что каретка не передвигается на следующую строку? Тогда как мне ее передвинуть? Я искал способы перебора строк с помощью индексов на них, но так и не нашел честно говоря. Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: kambala от Июня 09, 2011, 23:30 спрошу еще раз - зачем нужен режим QIODevice::Truncate для чтения файла? по-моему он используется только при записи файла. или я чего-то не знаю?
первый код (Test.dat) похож на правду (считывание строк есть). внешний цикл - это while, а внутренний - for, ты все правильно понял. но посмотри на условие завершения внутреннего цикла (т.е. цикла for): Код: k=GlobalVaribles::all[j][1] Название: Re: Алгоритм чтения из файла в динамический двумерный массив. Отправлено: Igors от Июня 10, 2011, 00:55 Код: QTextStream in2(&file2); - QIODevice::Truncate | QIODevice::Text - не нужно привлекать посторонние детали надеясь что они решат Ваши проблемы, этого не произойдет - столько раз написать GlobalVaribles:: может только "не ленивый программист" :) С++ настойчиво Вам говорит - это должен быть static метод GlobalVaribles, а не просто ф-ция - если у Вас проблемы с чтением файла, то надо ими и заниматься, добившись сначала работы на "холостом ходу", т.е. все строки нормально читаются и печатаются в консоли. Смешивая это с подробностями Вашей задачи Вы грузите форум бесполезной информацией и намного увеличиваете время разборок Название: Re: Алгоритм чтения из файла в динамический д Отправлено: Ovoshlook от Июня 10, 2011, 06:11 Цитировать k=GlobalVaribles::all[j][1] :oБлин... Как сразу не увидел... Цитировать QTextStream in2(&file2); while (!file1.atEnd()) Это опечатка так сказать) Исправлена давно, просто копировал с первого поста) Цитировать столько раз написать GlobalVaribles:: Да просто сама функция копирована с записи файла.. все никак не почищю) щас этим и займусь. Цитировать столько раз написать GlobalVaribles:: Это класс который содержит статические функции члены... Другого вызова таких членов без создния экземпляра класса я не знаю(Кстаи пасибо все за советы. Заработало наконец) Видимо утро вечера мудренее все таки)) |