Новая строка видна в командной строке, но та же строка видна с \n в выводе файла

У меня есть этот код, который работает нормально

#include <iostream>
#include <set>
#include <sstream>

int main()
{   
    std::set<std::string> a;
    a.insert("foo");
    a.insert("bar");
    a.insert("zoo");
    a.insert("should");
    a.insert("work");
    std::stringstream b;
    std::set<std::string>::iterator it;
    for (it = a.begin(); it != a.end(); it++)
    {
        b << " " << *it <<"," <<"\n";

    }

    std::string aaa = b.str();
    std::cout <<aaa;
}

Вывод в командной строке:

bar, //new line after ","
foo, //new line after ","
should,
work,
zoo,

Если я попытаюсь записать одну и ту же строку aaa в файл, я ожидаю, что один и тот же вывод будет напечатан в файле, т.е. каждая строка после "," в новой строке, скорее я получаю вывод в своем файле следующим образом (в одной строке с \ п):

" bar,\n foo,\n should,\n work,\n zoo,\n"

Кто-нибудь может мне с этим помочь?

Дополнительная информация о записи строки в файл:

Вот как я записываю в файл:

boost::property_tree::ptree pt1;
pt1.put( "Output", aaa );
boost::property_tree::write_json( "result.json", pt1 );

Это запишет файл JSON, вывод приведенного выше кода в (Windows - NotePad/NotePad++) выглядит следующим образом:

{
    "Output": " bar,\n foo,\n should,\n work,\n zoo,\n"
}

person silent_programmer    schedule 06.02.2017    source источник
comment
Вы используете винду или линукс? похоже, проблема в разнице между окончаниями строк.   -  person NathanOliver    schedule 06.02.2017
comment
Как вы открываете файл, чтобы посмотреть его? Вы не должны видеть кавычки или \n, если откроете его в редакторе.   -  person Daniel H    schedule 06.02.2017
comment
Опубликуйте код, который записывает его в файл, если это то, с чем у вас возникла проблема.   -  person    schedule 06.02.2017
comment
вам нужен тот же вывод, что и командная строка в вашем файле?   -  person Shakiba Moshiri    schedule 06.02.2017
comment
@NathanOliver Я хочу получить результат как для Linux, так и для Windows.   -  person silent_programmer    schedule 06.02.2017
comment
Windows(\r\n) и linux(\n) поддерживают разные типы окончания строки. Иметь ввиду.   -  person jack jay    schedule 06.02.2017
comment
@DanielH Я открываю файл в Блокноте.   -  person silent_programmer    schedule 06.02.2017
comment
Может быть, @NeilButterworth прав, запись в файл может быть проблемой. Позвольте мне отредактировать сообщение с кодом для записи файла.   -  person silent_programmer    schedule 06.02.2017
comment
@k-five да, я хочу получить такой же результат   -  person silent_programmer    schedule 06.02.2017
comment
@jackjay Спасибо, приведенный выше вывод предназначен только для Windows.   -  person silent_programmer    schedule 06.02.2017
comment
Используйте блокнот++ вместо блокнота. С этим делом справляется гораздо лучше. Он даже скажет вам, какая строка заканчивается в файле.   -  person NathanOliver    schedule 06.02.2017
comment
@NathanOliver NotePad++ показывает тот же результат.   -  person silent_programmer    schedule 06.02.2017
comment
Я уже использовал notepad++, и он показывает и окно, и файл linux как одно и то же   -  person Shakiba Moshiri    schedule 06.02.2017
comment
В этих комментариях много дезинформации об окончаниях строк....   -  person Qix - MONICA WAS MISTREATED    schedule 06.02.2017
comment
@Qix: Например?   -  person Lightness Races in Orbit    schedule 06.02.2017
comment
Комментарий @LightnessRacesinOrbit Натана Оливера, за который проголосовали +5, утверждает, что это проблема с окончанием строки просто потому, что она связана с \n, хотя было правильно указано, что это проблема JSON и ожидаемое поведение. Файловые операции не заботятся о концах строк в C++ (при условии, что вы используете стандартные функции). Это зависит от логики приложения. Notepad++ не будет отображать \r\n и \n как одно и то же, потому что это не так. И, как уже говорилось ранее, это вовсе не проблема с окончанием строки.   -  person Qix - MONICA WAS MISTREATED    schedule 07.02.2017
comment
@Qix: комментарий Натана не является информацией или дезинформацией об окончаниях строк, а является предположением о вопросе до того, как к нему была добавлена ​​информация для устранения неоднозначности (до того, как к нему было добавлено что-либо о JSON). Вы несправедливы. Notepad++ не будет отображать \r\n и \n как одно и то же, потому что это не так. На самом деле это так; он показывает их как новую строку, определяя схему окончания строки файла при его открытии. Таким образом, различие скрыто от ничего не подозревающего пользователя. Что-нибудь еще?   -  person Lightness Races in Orbit    schedule 07.02.2017


Ответы (2)


Вы пишете не нормальный файл! Вы используете библиотеку JSON для записи файла. И, как это бывает, в строках JSON символ конца строки экранируется так же, как в исходных файлах C, то есть как "\n".

Итак, подводя итог, это ожидаемое поведение. Если вы хотите получить нормальные символы конца строки, напишите нормальный файл с fopen() и друзьями.

person rodrigo    schedule 06.02.2017
comment
Я работаю над получением JSON в качестве вывода, это простая в использовании библиотека повышения, а не создание файла. Можно ли каким-либо образом использовать обычные символы EOL с этой библиотекой Boost JSON? - person silent_programmer; 06.02.2017
comment
@silent_programmer: эти требования не имеют смысла. Символ LF недействителен внутри строки JSON, он должен быть закодирован как \n (или \u000a). Если вы хотите, чтобы ваш текст был разделен на правильные строки, вы можете использовать программу просмотра JSON. Я не знаю ни одного, но уверен, что есть несколько ... Обычный текстовый редактор не покажет вам это. - person rodrigo; 06.02.2017
comment
@silent_programmer: если тема JSON не является жестким требованием, взгляните на этот вопрос. - person rodrigo; 06.02.2017
comment
Спасибо за информацию, но JSON является требованием. - person silent_programmer; 06.02.2017

Это ожидаемое поведение.

Вы передаете строку (содержащую символы новой строки) в библиотеку JSON для кодирования в JSON. Этот шаг кодирования включает в себя преобразование новых строк в подстроку "\n", потому что именно так мы представляем новые строки внутри строк в JSON.

Узнайте больше о JSON на веб-сайте json.org.

person Lightness Races in Orbit    schedule 06.02.2017