Невозможно записать данные json в файл на С++

У меня есть данные 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 ничего не сохраняется.

Странное имя выходного файла — успешно ли он был открыт?

Davis Herring 27.05.2019 06:43

@DavisHerring Как проверить, был ли открыт файл или нет?

S Andrew 27.05.2019 06:50

@DavisHerring Или вы имеете в виду, что мне нужно сначала открыть файл, например output_file.open()

S Andrew 27.05.2019 06:51

Есть ли у вашей учетной записи пользователя по умолчанию доступ для записи в $C:\Program Files (x86)$? Иногда компьютерам с Windows по умолчанию требуется доступ администратора для записи в $Program Files (x86)$ или $Program Files$. В этом случае вы должны вручную предоставить разрешение на запись для своей учетной записи пользователя.

RandomPerfectHashFunction 27.05.2019 06:52

@RandomPerfectHashFunction Да, у него есть все права, необходимые для открытия/сохранения файла на C. Я проверил это с другим кодом cpp, записывающим образец текста в файл example.txt, и он отлично работает, но только с этим json, он не пишет что-нибудь.

S Andrew 27.05.2019 06:54

Попробуйте $output_file << outJson.dump(); выходной_файл.flush(); output_file.close()$ в конце программы? Это работает?

RandomPerfectHashFunction 27.05.2019 06:58

@RandomPerfectHashFunction Похоже, я не закрывал файл и, следовательно, не сохранял его. Я сделал: output_file << outJson; output_file.close(); и все работало нормально без дампа и сброса. Я просто хотел знать, как я могу включить indent=4 и ensure_ascii=False.

S Andrew 27.05.2019 07:09

@RandomPerfectHashFunction с output_file << outJson.dump(4), он сохраняется, как и ожидалось. Спасибо. Если вы можете опубликовать ответ, я приму его.

S Andrew 27.05.2019 07:15

Пожалуйста. Рад, что смог помочь.

RandomPerfectHashFunction 27.05.2019 07:22

@SAndrew: Вы можете просто преобразовать поток в bool.

Davis Herring 27.05.2019 08:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
1 383
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь должна помочь явная сериализация и вызов close() перед выходом.

output_file << outJson.dump(4);
output_file.close(); 

Что происходит без .dump(4)?

Davis Herring 27.05.2019 08:45

Код функционально работает без $dump(4)$. Он включен, так как спрашивающий попросил красиво распечатать вывод JSON с отступом в 4 пробела.

RandomPerfectHashFunction 27.05.2019 21:48

Что же тогда означает «явная сериализация»? В остальном то, что у вас есть, такое же, как в вопросе, и .close() автоматически при уничтожении.

Davis Herring 28.05.2019 00:14

Неявная сериализация — это когда компилятор неявно вызывает dump() из механизма перегрузки оператора. Явная сериализация — это когда пользователь явно вызывает dump(). Я знаю, что close() вызывается во время уничтожения объекта, но OC опубликовал вопрос, поскольку на его машине этого точно не происходило. Мои комментарии в его вопросе подсказали ему изменить свой код, как показано в ответе, и это сработало для него. Я отредактирую свой ответ, чтобы сделать его более понятным.

RandomPerfectHashFunction 29.05.2019 20:48

Другие вопросы по теме