文件读取缓冲区C和C ++之间相同的方法吗?

时间:2017-10-05 08:21:53

标签: c++ c jansson

我正在使用Jansson 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 ++类中实现的。 Jansson库返回的错误与文件结尾字符有关。

此时我尝试使用更优雅的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的代码,以便文件结束,字符可以“消失”#34; ?

1 个答案:

答案 0 :(得分:7)

您需要为C代码添加终结符。在某些情况下,你可以侥幸逃脱它,而其他时候则没有:

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

请注意,在C ++版本c_str()中,请为您提供C字符串终结符。