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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Перевод каретки на новую строку  (Прочитано 14373 раз)
alik
Гость
« : Март 05, 2015, 10:08 »

Здравствуйте,

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

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

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

Что я делаю не так?
« Последнее редактирование: Март 05, 2015, 16:11 от alik » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Март 05, 2015, 10:13 »

Вас endl и "\n" не устраивают?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Март 05, 2015, 10:21 »

В вашем случае можно так
Код
C++ (Qt)
char nl[] = {13, 13, 10, 0};
QString string(nl);
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #3 : Март 05, 2015, 10:25 »

Вы пытаетесь будто сделать:
QString EndOfLine = 36;
Как уже написали выше, используйте
QString EndOfLine("\n") или QString EndOfLine("\r\n").
Записан
alik
Гость
« Ответ #4 : Март 05, 2015, 10:26 »

Вас endl и "\n" не устраивают?

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

Сообщений: 600



Просмотр профиля
« Ответ #5 : Март 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");
................................
« Последнее редактирование: Март 05, 2015, 10:43 от deMax » Записан
alik
Гость
« Ответ #6 : Март 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 ?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Март 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 символа )
Записан

deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #8 : Март 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));
« Последнее редактирование: Март 05, 2015, 11:15 от deMax » Записан
alik
Гость
« Ответ #9 : Март 05, 2015, 11:24 »

Большое спасибо всем за помощь !
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Март 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'     

Считается хорошим тоном корректное чтение всех возможных концов строк, т.к. файл может быть создан на любой платформе. Многие редакторы имеют опцию какой конец строки использовать
Записан
alik
Гость
« Ответ #11 : Март 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;
    }
}

Как узнать в какой ОС запущена программа ?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #12 : Март 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
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Март 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: и в названии темы исправьте кОретку - ну уж очень кАряво  Улыбающийся
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #14 : Март 05, 2015, 16:58 »

Как узнать в какой ОС запущена программа ?
Как то так:
#if defined(Q_OS_WIN)
#elif defined(Q_WS_X11)
№elif defined(Q_WS_LINUX)
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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