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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QTextStream: не работает tutorial example ...  (Прочитано 16088 раз)
crocus
Гость
« Ответ #15 : Январь 11, 2007, 03:09 »

Прочитал топик - так и не понял задачи, сформулируй чего ты хочешь. Что касается чтения и записи из файла в файл, мне помогли примеры \4.2.2\demos\textedit и \4.2.2\examples\dialogs\findfiles.
Цитировать
файлы нужны поочереди. запустилась прога, ты указал сколько нужно и для каждого задал имя

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

Может лучше придерживаться стиля программирования как у Бланшет и в Асистенте.
Записан
Dendy
Гость
« Ответ #16 : Январь 11, 2007, 05:46 »

Запустилась прога, указал количество файлов и имена и... сохранил их в QStringList. При обращении берёшь нужное имя, открьІваешь файл. Я сходу не представляю задачу, в которой нужно держать открьІтьІми сотню файлов. Но если действительно их количество неизвестно - правильньІй способ хранить на них указатели: QList<QFile*>, QHash<QString,QFile*>, ибо операции копирования для обьектов запрещеньІ.
Записан
noname.pl
Гость
« Ответ #17 : Январь 11, 2007, 08:03 »

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

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

 p.s.: 2crocus% с "проблемой" описанной в начале топика я уже разобрался. она заключалась в том, что после прочтения текстового потока методом readAll() терялся указатель на начало файла, и второй раз я читал с конца до конгца. то есть не читал ничего. ну + мелкие стилистические помарки.
Записан
crocus
Гость
« Ответ #18 : Январь 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();

Грубо говоря- открыли папку- считали все файлы из папки в один новый файл- закрыли новый.
Записан
noname.pl
Гость
« Ответ #19 : Январь 11, 2007, 12:08 »

а чем плох подход
Код:
QFile p_file = new Qfile("x:/tempdir/example.txt");
скажем в цикле обработки может кто-то сказать?
Записан
Dendy
Гость
« Ответ #20 : Январь 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;


Другими словами. ВременньІе переменньІе, не вьІходящие за предельІ области видимости, и которьІе корректно самоочищаются создавайте в стеке.
Записан
noname.pl
Гость
« Ответ #21 : Январь 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) перед { ... в чем прикол?
Записан
noname.pl
Гость
« Ответ #22 : Январь 12, 2007, 16:36 »

если быть точнее ругается на строку
Код:
file->files = new (QFile *)[count];
не нравится ему [count]: error C2337: 'count' : attribute not found
Записан
Dendy
Гость
« Ответ #23 : Январь 12, 2007, 17:19 »

Неужели тьІ "ето" собирал? Ето пример ужасного кода. Вот правильньІй:

Код:
QFile file( a:/b.c.txt );
if ( !file.open( QIODevice::ReadOnly ) )
  return;
QByteArray data = file.readAll();
Записан
noname.pl
Гость
« Ответ #24 : Январь 12, 2007, 17:34 »

хм ... просто вопрос был немного не о том. вопрос был о динамическом создании файлов. нужно заранее неизвестное количество файлов создавать. вот скажем есть форма на ней лайнедит и пушбаттон. пишем в lineEdit текст = 50. смысл в том, чтобы создать 50 файлов по маске типа
Код:
/tmp/delfirst/example1.txt
/tmp/delfirst/example2.txt
/tmp/delfirst/example3.txt
...
/tmp/delfirst/example50.txt

так чтобы не было утечек, и можно было бы обрабатывать файлы в любое последующее время (во время выполняния), то есть хранить их в каком-нить векторе или стеке или хрен знает где ещё ... вобщем я так и не получил (или не понял среди написанного тут) ответы на эти вопросы.
Записан
Dendy
Гость
« Ответ #25 : Январь 12, 2007, 18:56 »

А ето не ответ?

Цитата: "Dendy"
Но если действительно их количество неизвестно - правильньІй способ хранить на них указатели: QList<QFile*>, QHash<QString,QFile*>, ибо операции копирования для обьектов запрещеньІ.
Записан
noname.pl
Гость
« Ответ #26 : Январь 12, 2007, 19:23 »

ага, уже так и сделал. а как теперь правильно очистить память?
Код:
for(int i = 1; i <=ui.numberofPages->text().toInt(); i++){
delete fileList[i];
}
пойдет?
Записан
Dendy
Гость
« Ответ #27 : Январь 12, 2007, 20:04 »

Код:
qDeleteAll( fileList );
fileList.clear();
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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