Чтение файлов в буфере одинаковыми методами между C и C ++?

Я использовал Янссон Библиотека 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-подобный код, чтобы символы конца файлов могли «исчезнуть»?

2

Решение

Вам нужно добавить терминатор для кода C. Просто глупая удача, что в некоторых случаях вам это сходит с рук, а иногда нет:

char* data = malloc(size + 1);
long rd = fread(data, 1, size, f);
data[size] = '\0';

Обратите внимание, что в версии C ++ c_str() любезно предоставит вам терминатор строки C

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]