C 和 C++ 之间的缓冲区相同方法中的文件读取?
File reading in buffer identical methods between C and C++?
我正在使用 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++ [=26] 实现的=]. 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 的代码,以便文件结尾字符可以 "disappear" ?
您需要为C 代码添加终止符。在某些情况下你能侥幸逃脱,而在其他时候却没有:
char* data = malloc(size + 1);
long rd = fread(data, 1, size, f);
data[size] = '[=10=]';
请注意,在 C++ 版本中 c_str()
为您提供了一个 C 字符串终止符。
我正在使用 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++ [=26] 实现的=]. 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 的代码,以便文件结尾字符可以 "disappear" ?
您需要为C 代码添加终止符。在某些情况下你能侥幸逃脱,而在其他时候却没有:
char* data = malloc(size + 1);
long rd = fread(data, 1, size, f);
data[size] = '[=10=]';
请注意,在 C++ 版本中 c_str()
为您提供了一个 C 字符串终止符。