У меня есть данные json, которые я хочу записать в файл json на С++. Я использую нломанн джсон, и ниже приведен код:
using nlohmann::json;
std::ofstream output_file("C:\\Program Files (x86)\\output.json");
json outJson;
std::time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::string created(30, '\0');
std::strftime(&created[0], created.size(), "%Y-%m-%d %H:%M:%S", std::localtime(&now));
outJson["Created"] = created;
outJson["DataId"] = "T-452";
outJson["Type"] = "UserData";
output_file << outJson;
Но в output.json ничего не сохраняется.
@DavisHerring Как проверить, был ли открыт файл или нет?
@DavisHerring Или вы имеете в виду, что мне нужно сначала открыть файл, например output_file.open()
Есть ли у вашей учетной записи пользователя по умолчанию доступ для записи в $C:\Program Files (x86)$? Иногда компьютерам с Windows по умолчанию требуется доступ администратора для записи в $Program Files (x86)$ или $Program Files$. В этом случае вы должны вручную предоставить разрешение на запись для своей учетной записи пользователя.
@RandomPerfectHashFunction Да, у него есть все права, необходимые для открытия/сохранения файла на C. Я проверил это с другим кодом cpp, записывающим образец текста в файл example.txt, и он отлично работает, но только с этим json, он не пишет что-нибудь.
Попробуйте $output_file << outJson.dump(); выходной_файл.flush(); output_file.close()$ в конце программы? Это работает?
@RandomPerfectHashFunction Похоже, я не закрывал файл и, следовательно, не сохранял его. Я сделал: output_file << outJson; output_file.close(); и все работало нормально без дампа и сброса. Я просто хотел знать, как я могу включить indent=4 и ensure_ascii=False.
@RandomPerfectHashFunction с output_file << outJson.dump(4), он сохраняется, как и ожидалось. Спасибо. Если вы можете опубликовать ответ, я приму его.
Пожалуйста. Рад, что смог помочь.
@SAndrew: Вы можете просто преобразовать поток в bool.





Здесь должна помочь явная сериализация и вызов close() перед выходом.
output_file << outJson.dump(4);
output_file.close();
Что происходит без .dump(4)?
Код функционально работает без $dump(4)$. Он включен, так как спрашивающий попросил красиво распечатать вывод JSON с отступом в 4 пробела.
Что же тогда означает «явная сериализация»? В остальном то, что у вас есть, такое же, как в вопросе, и .close() автоматически при уничтожении.
Неявная сериализация — это когда компилятор неявно вызывает dump() из механизма перегрузки оператора. Явная сериализация — это когда пользователь явно вызывает dump(). Я знаю, что close() вызывается во время уничтожения объекта, но OC опубликовал вопрос, поскольку на его машине этого точно не происходило. Мои комментарии в его вопросе подсказали ему изменить свой код, как показано в ответе, и это сработало для него. Я отредактирую свой ответ, чтобы сделать его более понятным.
Странное имя выходного файла — успешно ли он был открыт?