Russian Qt Forum

Qt => Вопросы новичков => Тема начата: alik от Март 05, 2015, 10:08



Название: Перевод каретки на новую строку
Отправлено: alik от Март 05, 2015, 10:08
Здравствуйте,

Работаю с текстовыми файлами, где по окончанию строки необходимо делать переход на новую строку добавлением известной комбинации из char:

QString EndOfLine = char(13) + char(13) + char(10);

При попытке компиляции идет ругань:
"invalid conversion from 'int' to 'const char*' [-fpermissive]"

Что я делаю не так?


Название: Re: Перевод коретки на новую строку
Отправлено: __Heaven__ от Март 05, 2015, 10:13
Вас endl и "\n" не устраивают?


Название: Re: Перевод коретки на новую строку
Отправлено: __Heaven__ от Март 05, 2015, 10:21
В вашем случае можно так
Код
C++ (Qt)
char nl[] = {13, 13, 10, 0};
QString string(nl);


Название: Re: Перевод коретки на новую строку
Отправлено: torwig от Март 05, 2015, 10:25
Вы пытаетесь будто сделать:
QString EndOfLine = 36;
Как уже написали выше, используйте
QString EndOfLine("\n") или QString EndOfLine("\r\n").


Название: Re: Перевод коретки на новую строку
Отправлено: alik от Март 05, 2015, 10:26
Вас endl и "\n" не устраивают?

В соответствии с протоколом в текст нужно добавлять 13 13 10
А что реально добавляется при использовании endl и "\n" ?  


Название: Re: Перевод коретки на новую строку
Отправлено: deMax от Март 05, 2015, 10:39
Так не будет ругаться, правда и выдаст char(33)
QString EndOfLine(char(13) + char(13) + char(10));

Можно так, и еще множеством способов.
QString c = QString() + QChar(13) + QChar(13) + QChar(10);
QString c("\x0D\x0D\x0A");
................................


Название: Re: Перевод коретки на новую строку
Отправлено: alik от Март 05, 2015, 10:58
Так не будет ругаться, правда и выдаст char(33)
QString EndOfLine(char(13) + char(13) + char(10));

Можно так, и еще множеством способов.
QString c = QString() + QChar(13) + QChar(13) + QChar(10);
QString c("\x0D\x0D\x0A");
................................

Компилятор позволяет записать так:

QString Result = char(13);
Result += char(13);
Result += char(10)

Но будет ли при этом три чара (13, 13 и 10) или будет один равный 36 ?


Название: Re: Перевод коретки на новую строку
Отправлено: gil9red от Март 05, 2015, 11:07
Так не будет ругаться, правда и выдаст char(33)
QString EndOfLine(char(13) + char(13) + char(10));

Можно так, и еще множеством способов.
QString c = QString() + QChar(13) + QChar(13) + QChar(10);
QString c("\x0D\x0D\x0A");
................................

Компилятор позволяет записать так:

QString Result = char(13);
Result += char(13);
Result += char(10)

Но будет ли при этом три чара (13, 13 и 10) или будет один равный 36 ?

Будет 3.
Операция += это добавление символа к строке, поэтому будет 3 символа )


Название: Re: Перевод коретки на новую строку
Отправлено: deMax от Март 05, 2015, 11:09
Компилятор позволяет записать так:

QString Result = char(13);
Result += char(13);
Result += char(10)

Но будет ли при этом три чара (13, 13 и 10) или будет один равный 36 ?
Будет нормально, тоже самое но короче: QString c = QString(char(13)) + char(13) + char(10);
или QString c = (QString)char(13) + char(13) + char(10);

В соответствии с протоколом в текст нужно добавлять 13 13 10
А что реально добавляется при использовании endl и "\n" ?  
Зависит от платформы, под линуксом перенос строки вообще один символ. Под виндой возможно ваши 13,13,10 и есть. Т.е. сборка под андроид/линукс нарушит вам протокол.

p.s. я бы оставил QString c("\x0D\x0D\x0A");
еще так можно, хотя и жутко QString c = QString("%1%1%2").arg(char(13)).arg(char(10));


Название: Re: Перевод коретки на новую строку
Отправлено: alik от Март 05, 2015, 11:24
Большое спасибо всем за помощь !


Название: Re: Перевод коретки на новую строку
Отправлено: Igors от Март 05, 2015, 11:50
.. известной комбинации из char:

QString EndOfLine = char(13) + char(13) + char(10);
Известные комбинации такие

Платформа Mac: char(10)   '\r'     
Платформа Windows: char(13), char(10)   "\r\n"     
Платформа Uinix: char(13)   '\n'     

Считается хорошим тоном корректное чтение всех возможных концов строк, т.к. файл может быть создан на любой платформе. Многие редакторы имеют опцию какой конец строки использовать


Название: Re: Перевод коретки на новую строку
Отправлено: alik от Март 05, 2015, 12:37
.. известной комбинации из char:

QString EndOfLine = char(13) + char(13) + char(10);
Известные комбинации такие

Платформа Mac: char(10)   '\r'     
Платформа Windows: char(13), char(10)   "\r\n"     
Платформа Uinix: char(13)   '\n'     

Считается хорошим тоном корректное чтение всех возможных концов строк, т.к. файл может быть создан на любой платформе. Многие редакторы имеют опцию какой конец строки использовать


То есть разумно использовать следующую функцию:

QString EndOfLine()
{
    // Returns string of going on new line
    switch (local_OS)
    {
        osWINDOWS : return "\x0D\x0D\x0A"; break;
        osLINUX   : return "\x0D"; break;
        osANDROID : return '\n'; break;
    }
}

Как узнать в какой ОС запущена программа ?


Название: Re: Перевод коретки на новую строку
Отправлено: Johnik от Март 05, 2015, 12:49
В соответствии с протоколом в текст нужно добавлять 13 13 10
А что реально добавляется при использовании endl и "\n" ? 
QString EndOfLine()
{
    // Returns string of going on new line
    switch (local_OS)
    {
        osWINDOWS : return "\x0D\x0D\x0A"; break;
        osLINUX   : return "\x0D"; break;
        osANDROID : return '\n'; break;
    }
}
Что вам нужно? Если у вас какой-то бинарный протокол (как в одном из ваших сообщений выше), то вам так и надо указывать 13, 13, 10.
Если работаете с текстовыми данными, то в Qt новую строку принято обозначать '\n', что соответствует коду 10.

Почитать тут:
http://doc.qt.io/qt-5/qfile.html#reading-files-directly
http://doc.qt.io/qt-5/qtextstream.html#endl


Название: Re: Перевод коретки на новую строку
Отправлено: Igors от Март 05, 2015, 14:56
То есть разумно использовать следующую функцию:

QString EndOfLine()
{
    // Returns string of going on new line
    switch (local_OS)
    {
        osWINDOWS : return "\x0D\x0D\x0A"; break;
        osLINUX   : return "\x0D"; break;
        osANDROID : return '\n'; break;
    }
}

Как узнать в какой ОС запущена программа ?
На Вындоуз \x0D\x0A, т.е. один char(13) и один char(10), не надо упорно лепить два 13 (0x0D).
Не надо ничего узнавать про платформу. Вы пишете - все равно всем не угодите, т.к. файлы могут передаваться с одной платформы на другую. Ну и пишите как на Вындоуз. Если читаете используя Qt ф-ции - тоже не волнует т.к. наверняка Qt само разберется с разными концами строк. Вот если читаете текст посимвольно - тогда придется учесть. Ну до этого еще надо дожить.

Edit: и в названии темы исправьте кОретку - ну уж очень кАряво  :)


Название: Re: Перевод коретки на новую строку
Отправлено: deMax от Март 05, 2015, 16:58
Как узнать в какой ОС запущена программа ?
Как то так:
#if defined(Q_OS_WIN)
#elif defined(Q_WS_X11)
№elif defined(Q_WS_LINUX)


Название: Re: Перевод каретки на новую строку
Отправлено: kambala от Март 05, 2015, 21:33
Платформа Mac OS Classic (pre-OS X): char(10)   '\r'    
fixed. в OS X там \n