Я использовал Янссон Библиотека C для синтаксического анализа некоторого файла JSON и использования метода, использованного в файле примера, я попытался проанализировать его с помощью C-подобного кода:
FILE *f = fopen(json_path.c_str(), "r");
fseek(f, 0L, SEEK_END);
long size = ftell(f);
fseek(f, 0L, SEEK_SET);
char* data = (char*)malloc((size + 1) * sizeof(char));
long rd = fread((void*)data, 1, size, f);
json_t* root = load_json(data);
Хотя этот код хорошо работает, если скомпилирован с gcc
это не так, если он скомпилирован g++
как это было для меня, как это было реализовано в классе C ++. Ошибки, возвращаемые библиотекой Янссона, касались символов конца файла.
В этот момент я попытался реализовать более элегантный C ++ -подобный код, чтобы сделать это:
std::ifstream f(json_path.c_str());
if (f) {
std::stringstream s;
s << f.rdbuf();
f.close();
json_t* root = load_json(s.str().c_str());
}
И этот код никогда не выходит из строя, хотя мне кажется, что оба должны делать одно и то же.
Я сделал ошибку в своем C-подобном коде, чтобы прочитать файл во всем буфере? Как компиляция C ++ интерпретирует C-подобный код, чтобы символы конца файлов могли «исчезнуть»?
Вам нужно добавить терминатор для кода C. Просто глупая удача, что в некоторых случаях вам это сходит с рук, а иногда нет:
char* data = malloc(size + 1);
long rd = fread(data, 1, size, f);
data[size] = '\0';
Обратите внимание, что в версии C ++ c_str()
любезно предоставит вам терминатор строки C
Других решений пока нет …