Я пытаюсь открыть файл json, с которым я буду работать в C ++. Код, который я успешно использовал раньше, не может открыть файл. Я использую Visual Studio 2017 в Windows 10 Pro с JSON для Modern C ++ версии 3.5.0.
У меня есть очень простая функция, которая должна открывать файл в качестве входных данных для объекта json. Кажется, что файл открывается, но прерывается при записи его в объект json. Первоначально открываемый файл находился в другом каталоге, но я переместил его в тот же каталог, что и исполняемый файл во время тестирования ... но это не помогло.
Вот очень короткая функция, которая не работает:
json baselineOpenAndRead(string fileName) //passed string used for filename
{
json baseJObject;
cout << "we have a baseJObject" << endl;
//ifstream inFileJSON("test_file.json"); // Making this explicit made no difference
ifstream inFileJSON;
inFileJSON.open("test_file.json", ifstream::in);
cout << "we have opened json inFileJSON" << endl; // get here
inFileJSON >> baseJObject;
cout << " Can direct inFileJSON into baseJObject" << endl; //never get here; the app aborts.
inFileJSON.close();
return baseJObject;
}
Кажется, что это в основном идентично примеру на сайте nlohmann:
// read a JSON file
std::ifstream i("file.json");
json j;
i >> j;
Я просто ожидал, что это откроет файл json, загрузит его в объект и вернет объект. Вместо этого просто выходит.
Спасибо за любые мысли ... то есть, что я делаю не так? (Я собираюсь игнорировать, что это работало раньше ... может быть, я что-то пропустил).
- Al
В соответствии с просьбой, приведен минимальный воспроизводимый пример, но этодля компиляции потребуется nlohmann's json.hpp:
#include <iostream>
#include <fstream>
#include "json.hpp"
using json = nlohmann::json;
using namespace std;
string fileName;
json baselineOpenAndRead(string);
int main(int argC, char *argV[])
{
json baseJObject;
if (argC != 2) // check to make sure proper number of arguments are given.
{
cout << "\n\nFilename needed...";
exit(1); // number of arguments is wrong - exit program
}
else
{
fileName = argV[1];
baseJObject = baselineOpenAndRead(fileName); // opens and reads the Base Line JSON file
cout << "baseJObject returned" << endl;
}
return 0;
}
json baselineOpenAndRead(string fileName) //
{
cout << "File name: " << fileName << endl;
json baseJObject;
cout << "we have a baseJObject" << endl;
ifstream inFileJSON(fileName);
if (inFileJSON.is_open())
{
cout << "file open..." << endl;
if (nlohmann::json::accept(inFileJSON))
{
cout << "valid json" << endl;
try { inFileJSON >> baseJObject; }
catch (const std::exception &e) { std::cout << e.what() << '\n'; throw; }
}
else
{
cout << "not valid json" << endl;
}
}
else
{
cout << "file not really open" << endl;
}
inFileJSON >> baseJObject;
cout << " We can echo inFileJSON into baseJObject" << endl;
inFileJSON.close();
return 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 выше какdata.json, я получаю следующий вывод, а затем он выходит:
./Test_json data.json
File name: data.json
we have a baseJObject
file open...
valid json
[json.exception.parse_error.101] parse error at line 1, column 1: syntax error while parsing value - unexpected end of input; expected '[', '{', or a literal
Без попытки, он просто выходит. Он никогда не пройдет inFileJSON >> baseJObject;
Еще одна попытка, которая, кажется, работает, но почему?
ОК. Я пробовал это с той же основной (единственные изменения в функции):
json baselineOpenAndRead(string fileName) //
{
json baseJObject;
string filePath = "../baselines/" + fileName;
cout << "filePath: " << filePath << endl;
ifstream inFileJSON(fileName);
//baseJObject = json::parse(inFileJSON);
inFileJSON >> baseJObject;
cout << baseJObject << std::endl;
return baseJObject;
}
Это выглядит в принципе то же самое для меня. Я попытался сделать это ifstream inFileJSON (fileName.c_str ()) как на оригинале, так и на этом. Оригинал продолжал терпеть неудачу, этот продолжал работать. Извините, это так долго, но я не могу получить достойное форматирование комментариев ... Должен ли я просто попытаться ответить на свой вопрос вместо этого?