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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Алгоритм чтения из файла в динамический двумерный массив.  (Прочитано 26476 раз)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

в контейнерах для считывания элемента лучше использовать at() вместо []

std::vector <std::vector<QString> > MyVector - это явно не строковый массив, а строковая матрица Улыбающийся

Есть ли специальная функция у QFile
которая в текстовом файле может определить конец строки.
зачем это нужно? QFile и QTextStream могут читать файл построчно функцией readLine()
Цитата: LisandreL
Можно читать по строкам при помощи readLine/readLineData.
readLineData - защищённый метод
« Последнее редактирование: Июнь 09, 2011, 15:31 от kambala » Записан

Изучением 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
Гость
« Ответ #16 : Июнь 09, 2011, 15:50 »

Ну мне пока что не принципиально какие векторы использовать. Просто больше склоняюсь к стандартным вообще и в принципе (QFile не исключение, просто что первое было то и взял Улыбающийся, впринципе работа достаточно понятна и проста))
 
ну с   std::vector <std::vector<QString> > конечно интересно получилось) Сам сначала незаметил) Но сейчас уже переделывать не будуно на будущее возьму на заметку)

по поводу методов:

Вроде бы как они возвращают только длину строки.. или я ошибаюсь?

Пока писАл свое сообщение столько ответов )) Спасибо всем что помогаете)

Цитировать
td::vector <std::vector<QString> > MyVector - это явно не строковый массив, а строковая матрица
Ну как бе да)) Тпропустил слово многомерный)


Цитировать
зачем это нужно? QFile и QTextStream могут читать файл построчно функцией readLine()
Мне нужно определенным элементам массива присваивать определенные строки считанные из файла по определенному алгоритму. поэтому нужно каким либо образом получить доступ к  конкреным строкам. Пусть последовательно, но в итоге это должно работать вот так:
Код:
MyVector [i][j]=1 строка файла.
« Последнее редактирование: Июнь 09, 2011, 16:06 от Ovoshlook » Записан
Ovoshlook
Гость
« Ответ #17 : Июнь 09, 2011, 19:53 »

Ну и еще один вопрос. Если не сложно ответьте.
Ка определить конец текстового файла кроме QFile::atEnd?

Просто при конструкции

Код:
int j=0;
 while (!file2.atEnd())
{
j++;
qDebug()<<j;
}
у меня программа уходит в глубокий зависон и j уходит очень далеко (ну за 5000 точно...., дальше завершал процесс)
Записан
BRE
Гость
« Ответ #18 : Июнь 09, 2011, 20:14 »

Что бы дойти до конца файла, нужно как минимум читать из него (файла).
Записан
Ovoshlook
Гость
« Ответ #19 : Июнь 09, 2011, 20:19 »

Вот это работает без нареканий:
Код:
 
QFile file1("Test.dat");
    file1.open(QIODevice::ReadOnly | QIODevice::Truncate | QIODevice::Text);
    QDataStream in1(&file1);
    int i=0;

    while (!file1.atEnd())
    {
      

        ++i;
       qDebug<<i;
    }
    file1.close();

А вот это уходит в зависание:

Код:
 QFile file2("Text.txt");
    file2.open(QIODevice::ReadOnly | QIODevice::Truncate | QIODevice::Text);
    QTextStream in2(&file2);
    int j=0;

   while (!file2.atEnd())
    {
      
        ++j;
        qDebug()<<j;
    }
    file2.close();

Кстати когда исправил на while (in2.readLine!=NULL)

ситуация повторилась..
При чем in2.readAll; работает замечательно и показывает файл.
« Последнее редактирование: Июнь 09, 2011, 20:38 от Ovoshlook » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

по-хорошему надо писать
Код
C++ (Qt)
if (file.open(...))
{
   // файл открылся успешно, делаем что надо
}
else
{
   // можно сообщить об ошибке
}

далее: зачем ты создаешь файловые потоки, если ими даже не пользуешься? как тебе правильно сказали,
Что бы дойти до конца файла, нужно как минимум читать из него (файла).
мало ли почему первый код работает, а второй - нет (кстати сколько раз выводится i - столько, сколько символов в файле?). лучше этим не пользоваться.

Цитировать
Кстати когда исправил на while (in2.readLine!=NULL)
скорее уж while (!in2.readLine().isNull())
« Последнее редактирование: Июнь 09, 2011, 20:40 от kambala » Записан

Изучением 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
Гость
« Ответ #21 : Июнь 09, 2011, 20:51 »

Цитировать
далее: зачем ты создаешь файловые потоки, если ими даже не пользуешься?
Не. я ими пользуюсь. просто сейчас для дебага поставил именно счетчик j. На самом деле тело цикла while несколько иное. Но не в его содержании дело (как показывает дебаг, даже если просто j поставить все равно исход тот же)

Сейчас попробую поймать ошибку открытия файла через if. Но опять же. я вместо цикла просто поставил
QString str= in2.readAll;
qDebug()<<str;

И содержимое файла выводится.... Та что в открытии файла я не сомневаюсь, хотя не спорю что if else полезная штука.






Попробывал с if else. Ошибки открытия файла не обнаружилось... Совсем непонятно почему так...
« Последнее редактирование: Июнь 09, 2011, 21:01 от Ovoshlook » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

ты покажи свой реальный цикл для чтения файла, а не какой-то надуманный
Записан

Изучением 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
Гость
« Ответ #23 : Июнь 09, 2011, 21:16 »

Код:
 
QFile file2("Text.txt");
   if (file2.open(QIODevice::ReadOnly | QIODevice::Truncate | QIODevice::Text))
    {
        QTextStream in2(&file2);
        int j=0;

        while (!in2.readLine().isNull())
            {
                GlobalVaribles::QuestionAndAnswer.resize(j+1);
                GlobalVaribles::QuestionAndAnswer[j].resize(1);
                GlobalVaribles::QuestionAndAnswer[j][0]=in2.readLine();
                qDebug()<<GlobalVaribles::QuestionAndAnswer[j][0];
                for (int k=1;k=GlobalVaribles::all[j][1];k++)
                    {
                        GlobalVaribles::QuestionAndAnswer[j].resize(1+GlobalVaribles::all[j][1]);
                        GlobalVaribles::QuestionAndAnswer[j][k]=in2.readLine();
                        qDebug()<<GlobalVaribles::QuestionAndAnswer[j][k];

                    }
            ++j;
            //qDebug()<<j;
            }
            file2.close();
     }
    else
        QMessageBox::warning(0,tr("Warning"),tr("File not exists"),QMessageBox::Ok|QMessageBox::NoButton);
}

Ну собственно если я комментб тело цикла и оставляю только ++j и его дебаг то ситуация не меняется.

Такое ощущение что сам файл он читает, но он какой то бездонный получается или очень большой. Хотя в свойствах 2 килобайта весит...
« Последнее редактирование: Июнь 09, 2011, 21:21 от Ovoshlook » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #24 : Июнь 09, 2011, 21:32 »

не совсем понятно зачем нужен режим QIODevice::Truncate для чтения файла

readLine() читает строку и переходит к следующей - у тебя некоторые строки (которые попадают как раз в условие внешнего цикла) пропускаются (хотя может так и задумано - может там разделитель какой стоит)

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

и опять эти ресайзы вектора... неужто без них вообще никак не обойтись? Улыбающийся

да, и пример входного файла еще неплохо было бы увидеть
« Последнее редактирование: Июнь 09, 2011, 21:34 от kambala » Записан

Изучением 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
Гость
« Ответ #25 : Июнь 09, 2011, 21:46 »

Да. Строки должны пропускаться. Они потом заполняются во внутреннем цикле. Внутренний цикл всегда и должен быть истиным. Он работает от 1 и до значения  другого вектора. Без ресайзов к сожалению никак... Вектор изменяет свой размер динамически в зависимости от того сколько элементов мне нужно....

Тест файла:
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">werwer</p></body></html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">www</p></body></html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">qweq</p></body></html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">qweqwe</p></body></html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">qwertyu</p></body></html>
просто выгрузка из вектора потом должна произойти в TextEdit

Собственно как я уже говорил, если я уберу тело цикла и оставлю один только счетчик ситуация не поменяется...


Сейчас попробывал заполнить текстовый файл не через toHtml а через toPlainText. ситуация не изменилась к сожалению...
toPlainText Использовать конечно правильнее все таки будет... Но тем не менее.. Сам цикл почему то не работает...
« Последнее редактирование: Июнь 09, 2011, 21:55 от Ovoshlook » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

какой интересный у тебя файл - содержит сразу аж 5 полноценных хмтлок Улыбающийся

насколько я понимаю, это тупо содрано из содержимого QTextEdit. реально нужен именно такой вид файла? из нужных данных я тут вижу аж по одному слову из каждой хтмлки - как раз перед закрытием тега параграфа. каждое слово можно просто установить в QTextEdit, а свой стандартный стиль (большая часть твоего входного файла) он и так выставит.

что-то мне подсказывает, что то, что ты хочешь сделать тут, делается в разы проще...
Записан

Изучением 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
Гость
« Ответ #27 : Июнь 09, 2011, 22:22 »

Ну да. Оттуда и содран. Про стили так уже и понял, поэтому сдираю его теперь оттуда с помощью toPlainText().

проще это как?
Просто текст из файла должен загоняться в разные TextEdit'ы по определенным правилам. поэтому я загоняю этот текст в вектор, по как раз тем правилам. В итоге я получу структурированный по опять таки этим правилам Улыбающийся набор строк, который пото прегоню во много много эдитов...

Собственно поэтому я и читаю файл построчно...

Может есть какие нибудь идеи почему файл может так зацикливаться при чтении?

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

Сообщений: 4747



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

про зацикливание я уже писал, читай внимательнее
во внутреннем цикле условие вообще песня - оно всегда истинно. неудивительно, что файл тебе кажется бездонным Улыбающийся
Записан

Изучением 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
Гость
« Ответ #29 : Июнь 09, 2011, 22:34 »

Если  убераю вообще все тело цикла while ситуация не меняется...
То есть если я оставлю только

while (!file2.atEnd())
    {
       
        ++j;
        qDebug()<<j;
    }


Зависание все равно происходит.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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