2017-10-05 62 views
2

我用的是Jansson C庫來分析一些JSON文件,並使用示例文件所使用的方法我嘗試使用類似C的代碼來解析它:緩衝區中的文件讀取C和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代碼以便文件字符結束可以「消失」?

+3

'load_json'可能期望*** null結尾的**字符串*?因爲C代碼不會終止它讀取的數據。這是你的問題嗎?這是你所說的「關於文件字符結束」的意思嗎? –

回答

6

您需要爲C代碼添加終止符。這是您擺脫它在某些情況下,其他時候不只是偶然的運氣:

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

注意的是,在C++版本c_str()好心提供一個C字符串終結你。

+1

這很簡單嗎?在某些情況下,我已經手動添加了這個功能,但是在這裏我從未想到過。謝謝 ! – baptiste

+1

「只是運氣不好」 - >「運氣不好」。由於UB的成功比失敗更糟糕 – Caleth