Russian Qt Forum

Qt => Общие вопросы => Тема начата: noname.pl от Январь 06, 2007, 09:14



Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 06, 2007, 09:14
в конструкторе класса пишу:
Код:

this->tempdir = new QString; //QString *tempdir
qf_tempdir = new QFile("x:/tempdir/example.txt"); //QFile *qf_tempdir;
QTextStream* in = new QTextStream(qf_tempdir);
*tempdir = in->readAll();
ui.textEdit->setText(*tempdir);

запускаю, все компилится. но я не вижу текста в textEdit !! ... пусто. что опять не так? з.ы.: в примере книги по qt3 вместо readAll() написан просто read(), но если я пишу просто read() - компилятор просит указать в скобках параметр типа qint64 maxlen ... по-этому я решил заюзать readAll. как мне увидеть текст??
ещё не хочет работать
Код:
*tempdir->replace("a","b");

пишет illegal indirection ... help somebody!


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 06, 2007, 10:42
Начнём с чистописания. Я уверен на 99%, что строку в классе НЕ нужно вьІделять в куче, только по значению, так как её ресурсьІ разделяемьІ:

Код:
QString * tempdir; // WRONG!
QString tempdir; // GOOD


Логика подсказьІвает, что екземпляр файла тоже не нужно вьІделять в куче, так как устройство (IODevice) поддерживает понятие открьІто/закрьІто вместо вьІделено в памяти/не вьІделено. Хотя ето справедливо не во всех случаях, так как сам екземпляр файла уникален.

QTextStream стопудово не нужно вьІделять в куче! Ето всего лишь лёгкая обёртка над конвертацией текста. Она создаётся как правило временно и если передаётся, то по ссьІлке.

Теперь по вопросу. ВьІ забьІли открьІть файл:

Код:
file.setFileName( "x:/y/z.txt" );
if ( file.open( QIODevice::ReadOnly ) )
{
  QTextStream in( &file );
  ui.textEdit->setText( in.readAll() );
}


При попьІтке читать из неоткрьІтого файла получите сообщение в поток ошибок. Советую заглядьІвать туда регулярно, а ещё лучше - поставить на него брикпоинт или запись в лог.

Code Less, Create More!


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 07, 2007, 05:40
как заглянуть в поток ошибок / записать в лог?
опять какая-то проблема с replace. пишу:
Код:

QString qwe = in.readAll();
qwe.replace("windows", "unix");
n->ui.textEdit->setText(qwe);

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


Название: QTextStream: не работает tutorial example ...
Отправлено: bigirbis от Январь 07, 2007, 11:26
Посмотреть, где в файле находишься можно через QIODevice::pos ().
А файлик точно не пустой?


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 07, 2007, 12:02
2bigirbis% естественно не пустой. я немного параноидален, по-этому после каждого запуска проги просматриваю что с ним происходит. после "попытки чтения" все данные на месте. подскажи пару манипуляций с текстовым потоком, чтобы смотреть на "заглушки", чтобы контролировать что происходит внутри? и как просмотреть ошибки из потока ошибок? как сделать лог и тд?


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 07, 2007, 13:53
Может идиотский вопрос, но... Что такое Breakpoint знаете?

В Qt есть система сообщений от программьІ. Все они делятся на три группьІ: Debug, Warning, Fatal.

Все классьІ Qt снабженьІ Warning-сообщениями, сигнализирующими о возможной ошибке в программе, тем не менее при которьІх программа остается работоспособной. Пример: Чтение из неоткрьІтого файла.

При фатальной ошибке дальнейшая работа программьІ невозможна, так как допущен 100% баг программиста. Пример: вьІход за предельІ массива, Dead-Lock.

Если работаете в студии - stdout и stderr пишутся в окно Output/Debug.

Все сообщения можно перехватить с помощью:

QtMsgHandler qInstallMsgHandler( QtMsgHandler handler )


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 07, 2007, 14:30
в Output я заглядываю, warnings там нет. я подумал, что у текстового потока есть свой _специальный_ поток для ошибок, которые не отображаются в Output студии ... брекпоинтами никогда не пользовался.


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 07, 2007, 18:03
Цитата: "noname.pl"
... брекпоинтами никогда не пользовался.


В шоке.

Все ответьІ на твои вопросьІ заключаются в следующем:
ПривьІкай пользоваться брикпоинтами.


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 07, 2007, 19:02
ну зачем сразу так "я в шоке", я же не программист.


Название: QTextStream: не работает tutorial example ...
Отправлено: Steven_Orko от Январь 07, 2007, 21:28
Цитата: "noname.pl"
я же не программист
 :lol:  :lol:  :lol:


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 08, 2007, 02:42
Цитата: "noname.pl"
я же не программист.


В шоке ещё раз  :shock:  :D

Запомни. Программист - ето состояние души, муза, мера идейности и креативности. Программист не пишет программьІ, он их и творит. Можеш считать ето болезнью (программизм).

Если вовлёкся в изучение библиотеки, значит у тебя есть цель. Значит тьІ ужё заочно вошёл в круг инициативньІх и созидательньІх личностей. Студия - всего лишь программа для кодинга и отладки, воплощению символов текста в мечту, что способствует непрерьІвному полёту алгоритмической мьІсли программиста. Ето инструмент и брикпоинтьІ - его неотьемленая сущность.

Что бьІ тебе не говорили, что программист - ето просто профессия - не бери на веру. Программиста без мерьІ идейности вьІкинут на помойку невостребованности через 5 минут теста вакансии.

Незнание инструмента - не грех. Главное - способность освоить инструмент для воплощения своих мьІслей. Людей берут на роботу программиста не по принципа знаешь/не знаешь. Берут по принципу можешь научиться/не можешь научиться.

Лично я советую научить работе с брикпоинтами - очень полезная штука.


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 08, 2007, 03:16
это я понимаю, но у меня совсем нет практики. а изучать ветряные мельницы просто утомительно ... по-этому я заведомо берусь за задачу, которой делать не умею (язык для меня новый, библиотека так же, кроме языка новы и парадигмы связанные с больше с идеологией данного языка чем с синтаксисом). но назвать себя программистом, у меня не поворачивается язык. пока что я просто заинтересованный, мне просто стало интересно попрограммировать, шёлк! и вдруг интересно. я думаю что научиться могут все, наверное дело в желани, на сколько оно сильно и продолжительно, чтобы прилагать усилия ... ну и конечно кое-что решает случай и люди которые могут помочь. p.s.: брекпоинты взял на заметку.


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 10, 2007, 11:24
Цитата: "Dendy"
Логика подсказьІвает, что екземпляр файла тоже не нужно вьІделять в куче, так как устройство (IODevice) поддерживает понятие открьІто/закрьІто вместо вьІделено в памяти/не вьІделено. Хотя ето справедливо не во всех случаях, так как сам екземпляр файла уникален. [/b]

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


Название: QTextStream: не работает tutorial example ...
Отправлено: Вячеслав от Январь 10, 2007, 21:50
А они файлы все сразу нужны или по-очереди ? А то открывать(или статически выделять) пару тысяч файлов IMHO как-то не кошерно ;)


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 11, 2007, 00:30
может и не кошерно, но это условие задачи ... ну зачем тысячу, можно хотя бы в пределах 100. но смысл делать реализацию немасштабируемой? файлы нужны поочереди. запустилась прога, ты указал сколько нужно и для каждого задал имя, далее программа работает с файлами поочереди. сначал с одним, потом с другим потом с сто двадцать пятым. выполнился цикл работы с файлами и я могу ещё раз проделать то же самое не закрывая прогу.так что есть идеи?


Название: QTextStream: не работает tutorial example ...
Отправлено: crocus от Январь 11, 2007, 03:09
Прочитал топик - так и не понял задачи, сформулируй чего ты хочешь. Что касается чтения и записи из файла в файл, мне помогли примеры \4.2.2\demos\textedit и \4.2.2\examples\dialogs\findfiles.
Цитировать
файлы нужны поочереди. запустилась прога, ты указал сколько нужно и для каждого задал имя

Какие файлы ??? с диска или ты их сначала создал ??? если создал зачем так много.
И извини:
Цитировать
this->tempdir = new QString;

Может лучше придерживаться стиля программирования как у Бланшет и в Асистенте.


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 11, 2007, 05:46
Запустилась прога, указал количество файлов и имена и... сохранил их в QStringList. При обращении берёшь нужное имя, открьІваешь файл. Я сходу не представляю задачу, в которой нужно держать открьІтьІми сотню файлов. Но если действительно их количество неизвестно - правильньІй способ хранить на них указатели: QList<QFile*>, QHash<QString,QFile*>, ибо операции копирования для обьектов запрещеньІ.


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 11, 2007, 08:03
2crocus% ну почему же не понял, я предыдущем посте все ясненько описал ... мне уже тут сделали замечание по поводу увлечения выдылением всего в хип ... так что я немного запутался =)
2Dendy% нет, не одновременно. в _выполняющейся_ проге нужно указать количество файлов (возможно, и их имена). указал, нажал кнопку "фпирёт" и программа НЕ работает со всем одновременно. создала один файл, обработала, закрыла; второй - обработала ... и закрыла. и так далее. задача проста: генерация файлов по определенному правилу. ... спасибо за QHash.

добавлено спустя 2 минуты:

 p.s.: 2crocus% с "проблемой" описанной в начале топика я уже разобрался. она заключалась в том, что после прочтения текстового потока методом readAll() терялся указатель на начало файла, и второй раз я читал с конца до конгца. то есть не читал ничего. ну + мелкие стилистические помарки.


Название: QTextStream: не работает tutorial example ...
Отправлено: crocus от Январь 11, 2007, 08:30
Может это поможет.
Взято из примера findFile с небольшими доработками:
Код:

.........................

QString dirname = "C:\\Local Web\\";
QDir directory = QDir( dirname );
if ( fileName.isEmpty() )
fileName = "*";
files = directory.entryList( QStringList( fileName ),
QDir::Files | QDir::NoSymLinks );

unitName = "uniter.txt";
findFiles( directory, files, unitName );
...............................

void NewspaperWindow::findFiles( const QDir &directory, const QStringList &files, const QString &text)
{
    QProgressDialog progressDialog( this );
    progressDialog.setCancelButtonText( tr( "&Cancel" ) );
    progressDialog.setRange( 0, files.count() );
    progressDialog.setWindowTitle( tr( "Find Files" ) );

    QStringList foundFiles;
QFile userfile(text);
    if ( userfile.open( QIODevice::WriteOnly | QIODevice::Text ) )
    {
QTextStream out(&userfile);

        for ( int i = 0; i < files.count(); ++i )
        {
            progressDialog.setValue( i );
            progressDialog.setLabelText( tr( "Searching file number %1 of %2..." )
                                         .arg( i ).arg( files.count() ) );
            qApp->processEvents();

            if ( progressDialog.wasCanceled() )
                break;
            QFile file( directory.absoluteFilePath( files[ i ] ) );

            if ( file.open( QIODevice::ReadOnly ) )
            {
                QTextStream in(&file);
                while ( !in.atEnd() )
                {
                    if ( progressDialog.wasCanceled() )
                        break;

                    //userfile->write( file.readAll() );
QByteArray data = file.readAll();
QTextCodec *codec = Qt::codecForHtml( data );
QString str = codec->toUnicode( data );
QTextDocument * doc = new QTextDocument(this);
if ( Qt::mightBeRichText( str ) )
{
doc->setHtml( str );
str = doc->toPlainText();

}
else
{
str = QString::fromLocal8Bit( data );

}
out << str;
                    foundFiles << files[ i ];
                }
            }

        }
    }
    userfile.close();

Грубо говоря- открыли папку- считали все файлы из папки в один новый файл- закрыли новый.


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 11, 2007, 12:08
а чем плох подход
Код:
QFile p_file = new Qfile("x:/tempdir/example.txt");
скажем в цикле обработки может кто-то сказать?


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 11, 2007, 12:44
А чем плох код в цикле обработки:

Код:
struct MyFile
{
  int count;
  QFile ** files;
};

MyFile * file = new MyFile;
file->count = 1;
file->files = new (QFile *)[count];
QByteArray * data;
if ( file->count < 1 )
{
  return; // what? memory leak?
}
file->files[0] = new QFile( "a:/b/c.txt" );
if ( !file->files[0]->open( QIODevice::ReadOnly ) )
{
  // return? what? memory leak again?
  // no! goto destruct section
  goto destruct;
}
data = new QByteArray( file->files[0]->readAll() );
...
destruct:
delete data; // what? forgot to NULL pointer?
delete file->files[0];
delete file->files; // what? forgot to use delete[] ?
delete file;


Другими словами. ВременньІе переменньІе, не вьІходящие за предельІ области видимости, и которьІе корректно самоочищаются создавайте в стеке.


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 11, 2007, 18:39
я так понимаю резюмирующая строчка:
Код:
data = new QByteArray( file->files[0]->readAll() );
так? в таком случае можно не заботиться об утечке или как?
и деструкторы:
Код:
 delete data; // what? forgot to NULL pointer?
delete file->files[0];
delete file->files; // what? forgot to use delete[] ?
delete file;
писать не обязательно. правильно я вас понял?
p.s.: компилятор ругается на то что якобы не хватает точки с запятой после if (file->count < 1) перед { ... в чем прикол?


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 12, 2007, 16:36
если быть точнее ругается на строку
Код:
file->files = new (QFile *)[count];
не нравится ему [count]: error C2337: 'count' : attribute not found


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 12, 2007, 17:19
Неужели тьІ "ето" собирал? Ето пример ужасного кода. Вот правильньІй:

Код:
QFile file( a:/b.c.txt );
if ( !file.open( QIODevice::ReadOnly ) )
  return;
QByteArray data = file.readAll();


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 12, 2007, 17:34
хм ... просто вопрос был немного не о том. вопрос был о динамическом создании файлов. нужно заранее неизвестное количество файлов создавать. вот скажем есть форма на ней лайнедит и пушбаттон. пишем в lineEdit текст = 50. смысл в том, чтобы создать 50 файлов по маске типа
Код:
/tmp/delfirst/example1.txt
/tmp/delfirst/example2.txt
/tmp/delfirst/example3.txt
...
/tmp/delfirst/example50.txt

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


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 12, 2007, 18:56
А ето не ответ?

Цитата: "Dendy"
Но если действительно их количество неизвестно - правильньІй способ хранить на них указатели: QList<QFile*>, QHash<QString,QFile*>, ибо операции копирования для обьектов запрещеньІ.


Название: QTextStream: не работает tutorial example ...
Отправлено: noname.pl от Январь 12, 2007, 19:23
ага, уже так и сделал. а как теперь правильно очистить память?
Код:
for(int i = 1; i <=ui.numberofPages->text().toInt(); i++){
delete fileList[i];
}
пойдет?


Название: QTextStream: не работает tutorial example ...
Отправлено: Dendy от Январь 12, 2007, 20:04
Код:
qDeleteAll( fileList );
fileList.clear();