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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT4.3 fread...QString to char*.... прооблема.  (Прочитано 7539 раз)
AcerExtensa
Гость
« : Июнь 23, 2007, 21:46 »

Всем привет!
Нужна помощ или совет знающих..........

Код:
void MyDialog::on_opb_clicked(bool) {
la->selectAll();
la->del();
QString fn = QFileDialog::getOpenFileName(this);
if (!fn.isEmpty())
la->setText(fn);
QFileInfo info1(fn);
fs->setText(QString( "%1 Byte" ).arg( info1.size() ));  
}

Вобщем дело только в этом сдесь:
Код:
la->setText(fn);

la ето Объект QLineEdit
Туда записывается Полный путь к файлу.......
Все в порядке отображается тоже ОК.
далее................

Код:
void MyDialog::on_spb_clicked(bool) {
lb->selectAll();
lb->del();
QString fns = QFileDialog::getSaveFileName(this,"Save File","/root/Video/vivaldi/image.iso","ISO 9660 (*.iso)");
if (!fns.isEmpty())
lb->setText(fns);
QFileInfo info1(fns);
}

Тоже самое что и первое только наоборот...... полный путь к новому файлу в еще одну QLineEdit

а теперь проблема:
При нажатие на 3ю кнопку должен открыватся 1й файл, производится над ним действия и сохранятся в новый файл.......

Для чтения и записи файлов я пользую fread и fwrite, (т.к. все КюТэшные классы для файлов не подходят.... они работают но блин с ними время выполнения увеличевается минут на 40 при файле размером в 500мб)  для fread и fwrite(fopen) нужен чар как имя вместо КюСтринга...... делаю следующее
Код:

char *filename = la->text().toAscii().data();
char *newfile = lb->text().toAscii().data();


все вроде проходит нормально...... но вот проблема....... иногда файл открывается а иногда нет....... делал слежку за именем(дебаг типо)
и вобщем иногда получаю вместо нормального пути к файлу что то вроде
Код:
!@Fh*
и т.п.

Есть какая нибудь еще возможность конвертации QString в char?
Я в qt новичек.......
Или может что нибудь  посоветуете!? Только как я и говорил работать с QT IOшными классами бесполезно.......... очень увеличивается время выполнения операций над файлами...........

Буду рад любой помощи или совету!
Спасибо заранее!
Записан
kitov
Гость
« Ответ #1 : Июнь 23, 2007, 22:03 »

Есть ещё пару методов , посмотри в Дизайнере , но все они возвращают QByteArray .
Я всегда пользуюсь QString::toLocal8Bit() , проблем ещё не было .
Записан
AcerExtensa
Гость
« Ответ #2 : Июнь 23, 2007, 22:11 »

toLatin1() пробовал.......а toLocal8Bit() сегодня попробую........ спасибо!
Записан
Steven_Orko
Гость
« Ответ #3 : Июнь 24, 2007, 00:51 »

Тут на форуме подобная вещь уже обсуждалась, но т.к. твой вопрос не связан с этой темой, но ошибку ты делаешь ту же, то...

Насколько я знаю, вызов функции toAscii() возвращает временный массив байт, соответственно, ты пытаешься сохранить указатель на временные данные, которые после вычисления выражения будут удалены. Таким образом, у тебя указатель указывает (сорри, за каламбур) на "мусор".
Вот в этом коде ошибка.
Код:

char *filename = la->text().toAscii().data();
char *newfile = lb->text().toAscii().data();


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

Код:

int my_file = ::open(la->text().toAscii().data(), не_помню_параметров)
Записан
kitov
Гость
« Ответ #4 : Июнь 24, 2007, 12:12 »

Точно , я не заметил .
strcpy тебе в  помощь
Записан
pakulo
Гость
« Ответ #5 : Июнь 24, 2007, 12:32 »

а можно еще проще
qPrint(QString("text"))
если я правильно понял что нужно QString в char* перевести
это макрос тоже самое что и text().toLatin1().data() кажись
Записан
AcerExtensa
Гость
« Ответ #6 : Июнь 24, 2007, 14:26 »

Цитата: "Steven_Orko"
Тут на форуме подобная вещь уже обсуждалась, но т.к. твой вопрос не связан с этой темой, но ошибку ты делаешь ту же, то...

Насколько я знаю, вызов функции toAscii() возвращает временный массив байт, соответственно, ты пытаешься сохранить указатель на временные данные, которые после вычисления выражения будут удалены. Таким образом, у тебя указатель указывает (сорри, за каламбур) на "мусор".
Вот в этом коде ошибка.
Код:

char *filename = la->text().toAscii().data();
char *newfile = lb->text().toAscii().data();


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

Код:

int my_file = ::open(la->text().toAscii().data(), не_помню_параметров)


Улыбающийся ето и было решение проблемы...............
Всем спасибо за участие!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Июнь 24, 2007, 18:48 »

Цитата: "pakulo"
а можно еще проще
qPrint(QString("text"))
если я правильно понял что нужно QString в char* перевести
это макрос тоже самое что и text().toLatin1().data() кажись


1) Не qPrint, а qPrintable
2) Эквиваленте не  str.toLatin1().data(), а str.toLocal8bit().constData()
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pakulo
Гость
« Ответ #8 : Июнь 25, 2007, 17:28 »

Цитата: "pastor"

1) Не qPrint, а qPrintable
2) Эквиваленте не  str.toLatin1().data(), а str.toLocal8bit().constData()

сорри, напутал
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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