У нас есть проблема с открытием файлов json в C ++ с использованием Visual Studio 2017 в Windows 10 Pro (мы используем nlohmann json.hpp 3.7.0), и это, похоже, динамическая ошибка (из-за отсутствия лучшего термина). Иногда мы пишем код, и он работает нормально, а иногда нет. Мы думали, что это связано с кодировкой файлов json (UTF-8, ASCII и т. Д.), Но теперь это, кажется, не имеет значения. Включенный здесь код не работает, но очень похожий код в других программах работает.
Мы объявляем объект json, но когда мы пытаемся прочитать файл из объекта json, программа завершается неудачно. Однако, если мы просто читаем тот же файл с помощью getline (), мы читаем файл просто отлично. Мы не понимаем, что делаем неправильно. Ниже приведена функция (с некоторыми отладочными файлами), с которой мы работали. Цикл while, который читает файл с помощью getline (), работает отлично. однако чтение файла в объект json с помощью "inFileJSON >> baseJObject;"вызывает отмену программы.
Мы пробовали тестировать с очень простым файлом json, например так:
{
"people": [
{
"name": "Scott",
"website": "stackabuse.com",
"from": "Nebraska"
},
{
"name": "Larry",
"website": "google.com",
"from": "Michigan"
},
{
"name": "Tim",
"website": "apple.com",
"from": "Alabama"
}
]
}
Мы получаем то же поведение, что и с нашими большими файлами json.
У нас естьчитать файлы JSON в объекты JSON, как это раньше, и не было этой проблемы. Прямо сейчас это очень согласованно. Он печатает имя infile и прерывает его, как только он набирает 'InFileJSON >> baseJObject;' Мы что-то не так делаем с тем, как мы читаем файл? Предложения? Похоже, что это стандартный механизм для чтения файла json в объект json: https://github.com/nlohmann/json/issues/351.
Если бы он не работал только с нашими большими файлами, я бы заподозрил их, но приведенный выше json довольно прост. Мы даже попытались удалить оболочку массива из файла, и это не имело никакого значения.
json baselineOpenAndRead(string fileName) //
{
json baseJObject;
string filePath = fileName + "_base.json";
ifstream inFileJSON(filePath); // name of baseline file
//string line;
// I should have been clearer
//This while loop was only added to test whether
// I could open and read the file
// In my actual function, I am not doing this.
//I am going straight to the inFileJSON >> baseJObject;
//That is what fails; I have commented this out here to make
// things clearer
/* Debug code
if (inFileJSON.is_open())
{
cout << "i'm open" << endl;
while (getline(inFileJSON , line)) //this works
{
cout << line << '\n';
}
}
*/
cout << "infile: " << filePath << endl; //this prints
inFileJSON >> baseJObject; //we abort here
cout << "past >>: " << endl;
inFileJSON.close();
cout << "past close" << endl;
cout << "size: " << baseJObject.size() << endl;
return baseJObject;
}
Мы хотим прочитать содержимое файла в объект json для дальнейшей обработки. Прямо сейчас, это просто терпит неудачу с окном, заявляющим, что abort () был вызван. Больше всего нас беспокоит «динамический» аспект, упомянутый в первом абзаце. Этот же код работал. Может ли это быть что-то кроме кода?
Мы будем благодарны за любые мысли, которые могут возникнуть у кого-либо.
Спасибо -
Al