
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.148.127] |
![]() |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет.
Вот есть пример использования std::quoted: https://en.cppreference.com/w/cpp/io/manip/quoted ![]() ![]() #include <iostream> #include <iomanip> #include <sstream> void default_delimiter() { const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too"; std::stringstream ss; ss << std::quoted(in); std::string out; ss >> std::quoted(out); std::cout << "Default delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } void custom_delimiter() { const char delim {'$'}; const char escape {'%'}; const std::string in = "std::quoted() quotes this string and embedded $quotes$ $too"; std::stringstream ss; ss << std::quoted(in, delim, escape); std::string out; ss >> std::quoted(out, delim, escape); std::cout << "Custom delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } int main() { default_delimiter(); custom_delimiter(); } ![]() ![]() Default delimiter case: read in [std::quoted() quotes this string and embedded "quotes" too] stored as ["std::quoted() quotes this string and embedded \"quotes\" too"] written out [std::quoted() quotes this string and embedded "quotes" too] Custom delimiter case: read in [std::quoted() quotes this string and embedded $quotes$ $too] stored as [$std::quoted() quotes this string and embedded %$quotes%$ %$too$] written out [std::quoted() quotes this string and embedded $quotes$ $too] Внимание смотрим на stored as - ну че за говно? Откуда там взялось "" начальные? |
Сообщ.
#2
,
|
|
|
Странно, где вы тут баг увидели? Входная строка (read in) в точности соответствует выходной строке (written out).
А в stored as он сохранил все правильно (с экранированием). Если в строке встречается escape или delim тогда к ним подставляется еще один escape при << и удаляется при >>. ![]() ![]() #include <iostream> #include <iomanip> #include <sstream> void default_delimiter() { const std::string in = "std::quoted() quotes \\% this string and embedded \"quotes\" too"; std::stringstream ss; ss << std::quoted(in); std::string out; ss >> std::quoted(out); std::cout << "Default delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } void custom_delimiter() { const char delim {'$'}; const char escape {'%'}; const std::string in = "std::quoted() quotes \\% this string and embedded $quotes$ $too"; std::stringstream ss; ss << std::quoted(in, delim, escape); std::string out; ss >> std::quoted(out, delim, escape); std::cout << "Custom delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } int main() { default_delimiter(); custom_delimiter(); } Скрытый текст Обратите внимание на escape символы после слова quotes ![]() ![]() Default delimiter case: read in [std::quoted() quotes \% this string and embedded "quotes" too] stored as ["std::quoted() quotes \\% this string and embedded \"quotes\" too"] written out [std::quoted() quotes \% this string and embedded "quotes" too] Custom delimiter case: read in [std::quoted() quotes \% this string and embedded $quotes$ $too] stored as [$std::quoted() quotes \%% this string and embedded %$quotes%$ %$too$] written out [std::quoted() quotes \% this string and embedded $quotes$ $too] |
Сообщ.
#3
,
|
|
|
Цитата macomics @ А в stored as он сохранил все правильно (с экранированием). Мне надо строку заэкранировать и послать в JSON, начал гуглить что есть в плюсах, нашел эту функцию std::quoted, вроде она делает то, что надо, но добавляет в начало и конец строки - кавычки. Теперь от них избавляться надо по тупому. Причем она их добавляет, но не экранирует. Спрашивается нафига вообще эта функция нужна? Какой в ней смысл? Она экранирует кавычки и добавляет неэкранированные ковычки. Лол. Добавлено Цитата macomics @ Входная строка (read in) в точности соответствует выходной строке (written out). А в чем смысл этой функции вообще? Строку в кавычки обернуть? Вечно в плюсах все через жопу. Лучше бы сделали отдельно, функцию - которая оборачивает строку кавычками. А не пихали все в кучу. |
Сообщ.
#4
,
|
|
|
Цитата Wound @ А в чем смысл этой функции вообще? Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON. |
Сообщ.
#5
,
|
|
|
Цитата Wound @ А в чем смысл этой функции вообще? Получается, она из текста делает корректный литерал, который будет содержать этот текст. Если в выводе где-то есть добавление кавычек по краям без экранирования внутренних — надо убрать, функция как раз всё и делает за тебя Добавлено Цитата macomics @ Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON. Думаю, когда это писали, JSON просто не был популярен |
Сообщ.
#6
,
|
|
|
Цитата macomics @ Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON. А кому это нужно? Вместо чего то юзабельного - нарисовать какую то шнягу, которую вообще никто и никогда в жизни не будет юзать. Добавлено Цитата kopilov @ Думаю, когда это писали, JSON просто не был популярен Кого этописали? Эту функцию? std::quoted ? Она появилась судя по доке в С++14, в те времена XML отмер уже окончательно, передав бразды правления JSON'у |
Сообщ.
#7
,
|
|
|
Сообщ.
#8
,
|
|
|
Цитата kopilov @ Получается, она из текста делает корректный литерал, который будет содержать этот текст. Если в выводе где-то есть добавление кавычек по краям без экранирования внутренних — надо убрать, функция как раз всё и делает за тебя Чего она делает? Функция экранирует строку, типа написал ты A\", она тебе вернет "A\\\"", сама строка вот так будет выглядеть. Понимаешь? В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после " . Так что я вообще не понимаю зачем эта функция нужна. Я на нее набрел случайно, когда искал как экранировать строку в плюсах. |
Сообщ.
#9
,
|
|
|
Цитата Wound @ В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после " Для CSV это как раз очень удобно. |
Сообщ.
#10
,
|
|
|
Цитата Wound @ Так что я вообще не понимаю зачем эта функция нужна Как пример, для кодогенерации. stc::cout << "A\\\"" ; // выведет A\" Ну и с записью в прочие (кроме исходного кода) человеко-машино-читаемые форматы то же самое |
Сообщ.
#11
,
|
|
|
Цитата macomics @ Для CSV это как раз очень удобно. Есть много чего удобно, чего нет в плюсах. Зачем тогда эту функцию вводить стандарт - если она пилится для CSV и XML ? В плюсах - кавычки к строке добавить или обернуть строку в кавычки - это очень плевое дело, да хоть тем же форматом. А вот удалить из строки кавычки - без пол литра не разобраться. Зачем пилить говно функцию - которая нужна для каких то xml и тащить ее в плюсы? Как по мне обычное экранирование строк на порядки порядков чаще встречается, чем вот это все. Плюс если мне надо будет работать с XML, или CSV - я лучше возьму готовые библиотеки, чем буду извращаться на голых плюсах писать что то. Короче подход как всегда. Понавводить всякой шняги, при этом не нужной. Добавлено Цитата kopilov @ Как пример, для кодогенерации. stc::cout << "A\\\"" ; // выведет A\" Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь? |
Сообщ.
#12
,
|
|
|
Цитата Wound @ Зачем вам для чтения текстового файла какие-то специальные библиотеки? люс если мне надо будет работать ... или CSV |
Сообщ.
#13
,
|
|
|
Цитата macomics @ Зачем вам для чтения текстового файла какие-то специальные библиотеки? А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты? Желательно не портянкой вырвиглазной и багнутой, а парой тройкой строк кода ? Если вы не в силах это вопроизвести тут и сейчас, то вам стоило бы промолчать и пройти мимо, а не писать то что вы пишете. Или вы когда писали свой бред, то акцент делали на слово "для чтения" ? Если так, то я про "чтение" ничего не писал. Я писал про работу с конкретными форматами(кстати какое отношение вышеперечисленные форматы имеют к плюсам) ? Может еще какой нибудь Exel формат добавить в плюсы? |
Сообщ.
#14
,
|
|
|
Цитата Wound @ Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь? Разницу вижу. Не вижу, откуда взялся "\"A\\\"\"" ОК, держи полный пример. ![]() ![]() #include <iostream> #include <iomanip> int main(int argc, char** argv) { std::cout << "#include <iostream>" << std::endl; std::cout << "int main(int argc, char** argv) {" << std::endl; std::cout << " //We should print " << argv[1] << std::endl; std::cout << " //equivalent literal is " << std::quoted(argv[1]) << std::endl; std::cout << " std::cout << " << std::quoted(argv[1]) << " << std::endl;" << std::endl; std::cout << "}" << std::endl; } Сохраним, как generator.cpp, скомпилируем один раз. Сгенерируем несколько шаблонных кодов. (Я запускаю в Linux, поэтому тоже с экранированием, но апострофами, для простоты. Для сравнения, можно с этими же параметрами запустить echo) ![]() ![]() :~$ g++ -o generator generator.cpp :~$ ./generator '\' > generated1.cpp :~$ ./generator '"' > generated2.cpp :~$ ./generator 'A\"' > generated3.cpp Читаем получившиеся файлы (для понимания). И запускаем. ![]() ![]() :~$ g++ -o generated1 generated1.cpp :~$ g++ -o generated2 generated2.cpp :~$ g++ -o generated3 generated3.cpp :~$ ./generated1 \ :~$ echo '\' \ :~$ ./generated2 " :~$ echo '"' " :~$ ./generated3 A\" :~$ echo 'A\"' A\" Видим, что каждый сгенерированный исходник сохранил в человеко-машино-читаемом виде то, что было непосредственно задано при генерации |
Сообщ.
#15
,
|
|
|
Цитата Wound @ А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты? Вы не заметили, что я убрал XML. Я работаю с CSV и это очень удобно без каких-либо дополнительных библиотек. Цитата kopilov @ (Я запускаю в Linux, поэтому тоже с экранированием, но апострофами, для простоты. Для сравнения, можно с этими же параметрами запустить echo) Linux, кстати, тоже использует эту самую std::quoted для работы с командной строкой. Это тоже удобно для запуска внешних программ использовать. |