2012-12-18 5 views
6

Mã của tôi như thế này:Làm thế nào để đọc tệp json thành một chuỗi C++

std::istringstream file("res/date.json"); 
std::ostringstream tmp; 
tmp<<file.rdbuf(); 
std::string s = tmp.str(); 
std::cout<<s<<std::endl; 

Đầu ra là res/date.json, trong khi những gì tôi thực sự muốn là toàn bộ nội dung của file json này.

+2

Bạn phải mở tệp, sau đó đọc nội dung của tệp đó thành 'std :: string'. –

+4

Nên sử dụng ifstream, không phải istreamstream. – Kugel

+2

Sử dụng 'ifstream', không phải' istringstream'. –

Trả lời

9

này

std::istringstream file("res/date.json"); 

tạo ra một dòng (tên file) mà đọc từ chuỗi "res/date.json".

này

std::ifstream file("res/date.json"); 

tạo ra một dòng (tên file) mà đọc từ tập tin có tên res/date.json.

Xem sự khác biệt?

3

Tôi đã tìm thấy giải pháp tốt sau này. Sử dụng parser trong fstream.

std::ifstream ifile("res/test.json"); 
Json::Reader reader; 
Json::Value root; 
if (ifile != NULL && reader.parse(ifile, root)) { 
    const Json::Value arrayDest = root["dest"]; 
    for (unsigned int i = 0; i < arrayDest.size(); i++) { 
     if (!arrayDest[i].isMember("name")) 
      continue; 
     std::string out; 
     out = arrayDest[i]["name"].asString(); 
     std::cout << out << "\n"; 
    } 
} 
+8

Làm thế nào tôi có thể có 'Json :: Reader' trong dự án C++ của tôi? – STF

0

tôi đã cố gắng những thứ trên nhưng vấn đề là họ không làm việc trong C++ 14 cho tôi: P tôi nhận được những thứ như thế từ ifstream incomplete type is not allowed trên cả hai câu trả lời VÀ 2 json11 :: Json không có ::Reader hoặc một ::Value để trả lời 2 không hoạt động hoặc là tôi mỏng answoer cho ppl người sử dụng https://github.com/dropbox/json11 này là để làm một cái gì đó như thế này:

ifstream ifile; 
int fsize; 
char * inBuf; 
ifile.open(file, ifstream::in); 
ifile.seekg(0, ios::end); 
fsize = (int)ifile.tellg(); 
ifile.seekg(0, ios::beg); 
inBuf = new char[fsize]; 
ifile.read(inBuf, fsize); 
string WINDOW_NAMES = string(inBuf); 
ifile.close(); 
delete[] inBuf; 
Json my_json = Json::object { { "detectlist", WINDOW_NAMES } }; 
while(looping == true) { 
    for (auto s : Json::array(my_json)) { 
     //code here. 
    }; 
}; 

Lưu ý: đó là nằm trong một vòng lặp như tôi muốn nó lặp dữ liệu. Lưu ý: có ràng buộc phải có một số lỗi với điều này nhưng ít nhất tôi đã mở tệp chính xác không giống như trên.