运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

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

运维开发网 https://www.qedev.com 2020-07-13 19:32 出处:网络 作者:运维开发网整理
我使用 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
我使用 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的代码,以便文件字符结束可以“消失”?

您需要为C代码添加终止符.在某些情况下,你侥幸逃脱它,而有时则不是:

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

请注意,在C版本中,c_str()为您提供了一个C字符串终止符.

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消