Russian Qt Forum

Qt => Общие вопросы => Тема начата: QtProger от Октябрь 18, 2009, 13:21



Название: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 13:21
 Надо записать в файл текст, попробовал вот так, после выполнения этого кода в файле оказалось I?eaao. Как правильно записать в файл ?

Код
C++ (Qt)
  QFile file(fileName);
   file.open(QIODevice::WriteOnly);
   QTextStream text(&file);
   text << "Привет";


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 13:27
Надо записать в файл текст, попробовал вот так, после выполнения этого кода в файле оказалось I?eaao. Как правильно записать в файл ?
Почитай про кодировки и
void QTextStream::setCodec ( QTextCodec * codec );
void QTextStream::setCodec ( const char * codecName );


Название: Re: Как записать в файл ?
Отправлено: break от Октябрь 18, 2009, 13:43
+ еще может помочь
text << QStringFromUtf8( "Привет" );
если исходник в utf8


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 13:53
Написал text.setCodec("UTF-8"); но все равно получается абракадабра. Не понимаю ! UTF-8 - это юникод, а юникод ведь должен поддерживать русские символы


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 13:59
Написал text << QString::fromUtf8( "Привет" );
Теперь в файле вопросительные знаки


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 14:02
Написал text << QString::fromUtf8( "Привет" );
Теперь в файле вопросительные знаки
А в какой кодировке твои исходники?


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 14:04
А в какой кодировке твои исходники?

Как это узнать ?


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 14:08
Как это узнать ?
В консоле выполни locale.


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 14:10
Код:
'locale' is not recognized as an internal or external command,
operable program or batch file.

Я в Винде сижу. Наверно нет такой команды


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 14:15
Я в Винде сижу. Наверно нет такой команды
В main добавь:
Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForName( QTextCodec::codecForLocale() );
QTextCodec::setCodecForTr( codec );
QTextCodec::setCodecForCStrings( codec );
 

Выводи текст:
Код
C++ (Qt)
QFile file(fileName);
file.open(QIODevice::WriteOnly);
 
QTextStream text( &file );
text << QString( "Привет" );
 



Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 14:30
Выдает ошибку:

error: no matching function for call to `QTextCodec::codecForName(QTextCodec*)'

Код
C++ (Qt)
/*тут ошибка*/QTextCodec *codec = QTextCodec::codecForName( QTextCodec::codecForLocale() );
QTextCodec::setCodecForTr( codec );
QTextCodec::setCodecForCStrings( codec );


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 14:32
Выдает ошибку:
Это я запарился.  :)

Код
C++ (Qt)
QTextCodec *codec = QTextCodec::codecForLocale();
QTextCodec::setCodecForTr( codec );
QTextCodec::setCodecForCStrings( codec );


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 14:58
Работает !  :D Спасибо !!!


Название: Re: Как записать в файл ?
Отправлено: lit-uriy от Октябрь 18, 2009, 16:48
>>Как это узнать ?
Дык, тебе должно быть виднее.


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 17:54
Код
C++ (Qt)
QFile file(fileName);
file.open(QIODevice::WriteOnly);
QTextStream text( &file );
text << QString( "Привет" );

QString( "Привет" ) - это функция. Навожу на него мышь, нажимаю F1 и вылезает "QString Class Reference". Что такое QString ? ???


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 17:59
QString( "Привет" ) - это функция. Навожу на него мышь, нажимаю F1 и вылезает "QString Class Reference". Что такое QString ? ???
Класс такой.  :)


Название: Re: Как записать в файл ?
Отправлено: KADABRA от Октябрь 18, 2009, 18:25
QString( "Привет" ) - это функция.
Это не функция.


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 18:53
Цитировать
QString( "Привет" ) - это функция.
Ладно, я понял что это не функция, а класс. Подскажите пожалуйста, как называется такой прием программирования, чтобы я мог найти и почитать что-нибудь про это.


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 18:56
Цитировать
QString( "Привет" ) - это функция.
Ладно, я понял что это не функция, а класс. Подскажите пожалуйста, как называется такой прием программирования, чтобы я мог найти и почитать что-нибудь про это.
Создание временного объекта.
Для ясности, твой пример можно переписать так:
Код
C++ (Qt)
QString tmp( "Привет" );
text << tmp;
 


Название: Re: Как записать в файл ?
Отправлено: lit-uriy от Октябрь 18, 2009, 19:03
Т.е. просто использован конструктор класса. Также можно вызвать и метод класса:
Код
C++ (Qt)
QString( "Привет" ).toAscii()

В С++ и типы приводить рекомендуют через конструктор:
Код
C++ (Qt)
int a = 0x2;
char b = char(a);
// вместо
//char b =  (char) a


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 19:11
Т.е. просто использован конструктор класса. Также можно вызвать и метод класса:
Код
C++ (Qt)
QString( "Привет" ).toAscii()
:o
Метод конструктора ??!


Название: Re: Как записать в файл ?
Отправлено: BRE от Октябрь 18, 2009, 19:17
Т.е. просто использован конструктор класса. Также можно вызвать и метод класса:
Код
C++ (Qt)
QString( "Привет" ).toAscii()
:o
Метод конструктора ??!
Не конструктора, а метод временного безымянного объекта класса QString.
Код
C++ (Qt)
QString tmp( "Привет" );
tmp.toAscii();
 


Название: Re: Как записать в файл ?
Отправлено: QtProger от Октябрь 18, 2009, 19:27
Спасибо за инфу ! Буду разбираться  :)


Название: Re: Как записать в файл ?
Отправлено: lit-uriy от Октябрь 18, 2009, 20:20
Посмотри пример к функции int QString::count ( const QRegExp & rx ) const
там та же суть - приведение типа через конструктор (создание безымянного временного объекта)


Название: Re: Как записать в файл ?
Отправлено: KADABRA от Октябрь 19, 2009, 01:16
В С++ и типы приводить рекомендуют через конструктор:
Код
C++ (Qt)
int a = 0x2;
char b = char(a);
// вместо
//char b =  (char) a
В C++ типы рекомендуется приводить через набор cast'ов, в данном случае - через static_cast. C-style приведения в C++ не рекомендуется использовать вовсе, "оставлены" они для обратной совместимости с C.