На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Бага в плюсах ?
    Всем привет.

    Вот есть пример использования std::quoted: https://en.cppreference.com/w/cpp/io/manip/quoted
    ExpandedWrap disabled
      #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();
      }


    ExpandedWrap disabled
      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 - ну че за говно? Откуда там взялось "" начальные?
      Странно, где вы тут баг увидели? Входная строка (read in) в точности соответствует выходной строке (written out).

      А в stored as он сохранил все правильно (с экранированием).

      Если в строке встречается escape или delim тогда к ним подставляется еще один escape при << и удаляется при >>.

      ExpandedWrap disabled
        #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
      ExpandedWrap disabled
        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]
      Сообщение отредактировано: macomics -
        Цитата macomics @
        А в stored as он сохранил все правильно (с экранированием).

        Мне надо строку заэкранировать и послать в JSON, начал гуглить что есть в плюсах, нашел эту функцию std::quoted, вроде она делает то, что надо, но добавляет в начало и конец строки - кавычки. Теперь от них избавляться надо по тупому. Причем она их добавляет, но не экранирует. Спрашивается нафига вообще эта функция нужна? Какой в ней смысл? Она экранирует кавычки и добавляет неэкранированные ковычки. Лол.

        Добавлено
        Цитата macomics @
        Входная строка (read in) в точности соответствует выходной строке (written out).

        А в чем смысл этой функции вообще? Строку в кавычки обернуть? Вечно в плюсах все через жопу. Лучше бы сделали отдельно, функцию - которая оборачивает строку кавычками. А не пихали все в кучу.
        Сообщение отредактировано: Wound -
          Цитата Wound @
          А в чем смысл этой функции вообще?

          Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON.
            Цитата Wound @
            А в чем смысл этой функции вообще?

            Получается, она из текста делает корректный литерал, который будет содержать этот текст.
            Если в выводе где-то есть добавление кавычек по краям без экранирования внутренних — надо убрать, функция как раз всё и делает за тебя

            Добавлено
            Цитата macomics @
            Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON.

            Думаю, когда это писали, JSON просто не был популярен
              Цитата macomics @
              Там в самом начале написано, что функция действует в соответствии с форматами XML или CSV, а не JSON.

              А кому это нужно? Вместо чего то юзабельного - нарисовать какую то шнягу, которую вообще никто и никогда в жизни не будет юзать.

              Добавлено
              Цитата kopilov @
              Думаю, когда это писали, JSON просто не был популярен

              Кого этописали? Эту функцию? std::quoted ? Она появилась судя по доке в С++14, в те времена XML отмер уже окончательно, передав бразды правления JSON'у
              Сообщение отредактировано: Wound -
                Цитата kopilov @
                Думаю, когда это писали, JSON просто не был популярен

                Прикреплённая картинка
                Прикреплённая картинка


                Цитата Wound @
                Вместо чего то юзабельного - нарисовать какую то шнягу, которую вообще никто и никогда в жизни не будет юзать.

                Ну вы, например, CSV не используете. А вот мне приходится ещё им пользоваться.
                Сообщение отредактировано: macomics -
                  Цитата kopilov @
                  Получается, она из текста делает корректный литерал, который будет содержать этот текст.
                  Если в выводе где-то есть добавление кавычек по краям без экранирования внутренних — надо убрать, функция как раз всё и делает за тебя

                  Чего она делает? Функция экранирует строку, типа написал ты A\", она тебе вернет "A\\\"", сама строка вот так будет выглядеть. Понимаешь? В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после " . Так что я вообще не понимаю зачем эта функция нужна. Я на нее набрел случайно, когда искал как экранировать строку в плюсах.
                    Цитата Wound @
                    В ней появляются лишние неэкранированные кавычки, первая перед А, вторая после "

                    Для CSV это как раз очень удобно.
                      Цитата Wound @
                      Так что я вообще не понимаю зачем эта функция нужна

                      Как пример, для кодогенерации.
                      stc::cout << "A\\\"" ; // выведет A\"
                      Ну и с записью в прочие (кроме исходного кода) человеко-машино-читаемые форматы то же самое
                        Цитата macomics @
                        Для CSV это как раз очень удобно.

                        Есть много чего удобно, чего нет в плюсах. Зачем тогда эту функцию вводить стандарт - если она пилится для CSV и XML ?
                        В плюсах - кавычки к строке добавить или обернуть строку в кавычки - это очень плевое дело, да хоть тем же форматом. А вот удалить из строки кавычки - без пол литра не разобраться. Зачем пилить говно функцию - которая нужна для каких то xml и тащить ее в плюсы? Как по мне обычное экранирование строк на порядки порядков чаще встречается, чем вот это все. Плюс если мне надо будет работать с XML, или CSV - я лучше возьму готовые библиотеки, чем буду извращаться на голых плюсах писать что то. Короче подход как всегда. Понавводить всякой шняги, при этом не нужной.

                        Добавлено
                        Цитата kopilov @
                        Как пример, для кодогенерации.
                        stc::cout << "A\\\"" ; // выведет A\"

                        Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь?
                        Сообщение отредактировано: Wound -
                          Цитата Wound @
                          люс если мне надо будет работать ... или CSV
                          Зачем вам для чтения текстового файла какие-то специальные библиотеки?
                            Цитата macomics @
                            Зачем вам для чтения текстового файла какие-то специальные библиотеки?

                            А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты? Желательно не портянкой вырвиглазной и багнутой, а парой тройкой строк кода ?
                            Если вы не в силах это вопроизвести тут и сейчас, то вам стоило бы промолчать и пройти мимо, а не писать то что вы пишете.
                            Или вы когда писали свой бред, то акцент делали на слово "для чтения" ? Если так, то я про "чтение" ничего не писал. Я писал про работу с конкретными форматами(кстати какое отношение вышеперечисленные форматы имеют к плюсам) ? Может еще какой нибудь Exel формат добавить в плюсы?
                            Сообщение отредактировано: Wound -
                              Цитата Wound @
                              Для какой кодогенерации ? чем "\"A\\\"\"" отличается от "A\\\"" ? Ты разницу не видишь?

                              Разницу вижу. Не вижу, откуда взялся "\"A\\\"\""

                              ОК, держи полный пример.

                              ExpandedWrap disabled
                                #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)
                              ExpandedWrap disabled
                                :~$ g++ -o generator generator.cpp
                                :~$ ./generator '\' > generated1.cpp
                                :~$ ./generator '"' > generated2.cpp
                                :~$ ./generator 'A\"' > generated3.cpp


                              Читаем получившиеся файлы (для понимания). И запускаем.
                              ExpandedWrap disabled
                                :~$ g++ -o generated1 generated1.cpp
                                :~$ g++ -o generated2 generated2.cpp
                                :~$ g++ -o generated3 generated3.cpp
                                :~$ ./generated1
                                \
                                :~$ echo '\'
                                \
                                :~$ ./generated2
                                "
                                :~$ echo '"'
                                "
                                :~$ ./generated3
                                A\"
                                :~$ echo 'A\"'
                                A\"


                              Видим, что каждый сгенерированный исходник сохранил в человеко-машино-читаемом виде то, что было непосредственно задано при генерации
                                Цитата Wound @
                                А попробуйте ка, без каких-то специальных библиотек, распарсить XML файл на элементы и атрибуты?

                                Вы не заметили, что я убрал XML. Я работаю с CSV и это очень удобно без каких-либо дополнительных библиотек.

                                Цитата kopilov @
                                (Я запускаю в Linux, поэтому тоже с экранированием, но апострофами, для простоты. Для сравнения, можно с этими же параметрами запустить echo)

                                Linux, кстати, тоже использует эту самую std::quoted для работы с командной строкой. Это тоже удобно для запуска внешних программ использовать.
                                Сообщение отредактировано: macomics -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0653 ]   [ 17 queries used ]   [ Generated: 19.06.24, 04:32 GMT ]