2016-05-23 17 views
0

Ich versuche, Json-Dateien mit JsonCpp-Bibliothek zu analysieren. aber ich stehe vor einem Problem, das ich nicht beheben kann. Der unten gezeigte Code funktioniert perfekt, wenn ich eine Datei analysiere, aber wenn ich den Teil hinzufüge, der über Dateien im Verzeichnis iteriert, stürzt das Programm ab.Analysieren Satz von JSON-Dateien eins nach dem anderen

Die erste Funktion wird verwendet, um in einem bestimmten Verzeichnis nach JSON-Dateien zu suchen und ihre Namen im Vektor der Zeichenfolge (Ergebnisse) zu speichern.

In der Hauptfunktion beginnt das Programm mit der Definition der erforderlichen Erweiterung (.json) und dem Aufruf der Suchfunktion. Danach habe ich versucht, jede Datei zu öffnen, um sie zu analysieren.

Zum Schluss, Danke und ich schätze jede Art von Hilfe.

#include "jsoncpp.cpp" 
#include <stdio.h> 
#include "json.h" 
#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdio> 
#include <cstring> 
#include <unistd.h> 
#include <dirent.h> 
#include <vector> 

using namespace std; 



vector<string> results;    // holds search results 

// recursive search algorithm 
void search(string curr_directory, string extension){ 

    DIR* dir_point = opendir(curr_directory.c_str()); 
    dirent* entry = readdir(dir_point); 
    while (entry){         // if !entry then end of directory 
     if (entry->d_type == DT_DIR){    // if entry is a directory 
      string fname = entry->d_name; 
      if (fname != "." && fname != "..") 
       search(entry->d_name, extension); // search through it 
     } 
     else if (entry->d_type == DT_REG){  // if entry is a regular file 
      string fname = entry->d_name; // filename 
               // if filename's last characters are extension 
      if (fname.find(extension, (fname.length() - extension.length())) != string::npos) 
       results.push_back(fname);  // add filename to results vector 
     } 
     entry = readdir(dir_point); 
    } 
    return; 
} 

// 
// 
// 
// 


int main(int argc, char *argv[]) 
{ 

// read Files list 

    string extension; // type of file to search for 
    extension = "json"; 

    // setup search parameters 
    string curr_directory = "/Users/ITSGC_Ready2Go/3dMap"; 

    search(curr_directory, extension); 




// loop over files 
    //if (results.size()){ 
    //std::cout << results.size() << " files were found:" << std::endl; 
    for (unsigned int z = 0; z < results.size(); ++z){ // used unsigned to appease compiler warnings 

// Opening the file using ifstream function from fstream library 
    cout <<results[z].c_str()<<endl; 
    Json::Value obj; 
    Json::Reader reader; 

    ifstream test(results[z].c_str()); 
    //test.open (results[z].c_str(), std::fstream::in); 


// Selection objects inside the file 

    reader.parse(test,obj); 

    //test >> obj; 

// Parsing ID object and returning its value as integer  
    // cout << "id :" << stoi(obj["id"].asString()) <<endl; 

// Parsing Line object with its internal objects 

    const Json::Value& lines = obj["lines"]; 

    for (int i=0; i<lines.size();i++){ 

    cout << "index : " << i << endl; 
    cout << "id:" << lines[i]["id"].asString() <<endl; 
    cout << "type:" << lines[i]["type"].asString() <<endl; 
    cout << "function:" << lines[i]["function"].asString() <<endl; 
    cout << "color:" << lines[i]["color"].asString() <<endl; 

    const Json::Value& poly = lines[i]["polyPoints"]; 

    for (int j=0; j<poly.size();j++){ 

    cout << "batch#"<<j<<endl; 
    cout << "latitude" << poly[j]["latitude"].asFloat()<<endl; 
    cout << "longitude" << poly[j]["longitude"].asFloat()<<endl; 
    cout << "altitude" << poly[j]["altitude"].asFloat()<<endl; 

    } 

    } 



// Reading the OccupancyGrid object 

// OccupancyGrid object is copied into constant to parse the arrays inside 

    const Json::Value& occupancyGrid = obj["occupancyGrid"]; 
    cout << occupancyGrid.size() <<endl; 

// The size of occupancyGrid is the used as number of iterations (#of rows) 

    for (int l=0; l<occupancyGrid.size();l++){ 

// Arrays inside occupancyGrid are copied into constant to parse the elements inside each array 

    const Json::Value& element = occupancyGrid[l]; 

// iterations over the size of the array in order to parse every element 

     cout << "row" << l << "--> "; 
     for (int k=0;k<element.size();k++){ 

      cout << element[k].asFloat(); 
      if(k<element.size()-1){ cout<< ",";} 

      } 
     cout << endl; 
    } 

// Parsing roadSigns object as found in the file 
// Need to understand the difference between format in the mail and the 1456 file 

    const Json::Value& roadsigns = obj["roadSigns"]; 

    cout << "ArrayType: " << roadsigns["_ArrayType_"].asString()<<endl; 

    const Json::Value& ArraySize = roadsigns["_ArraySize_"]; 

    for(int t=0;t<ArraySize.size();t++){ 

    cout << ArraySize[t].asInt(); 
    if (t<ArraySize.size()-1){ cout << " , ";} 

    } 

    cout<< endl; 

    if (roadsigns["_ArrayData_"].asString().empty()) { 
    cout << "ArrayData: "<<roadsigns["_ArrayData_"].asFloat(); } 

    else { cout << "ArrayData: empty "; } 
    cout <<endl; 

    test.close(); 
    test.clear(); 
    cout << "Done" << endl; 
    cout << "...." << endl; 
    cout << "...." << endl; 

    } 
    //else{ 
    // std::cout << "No files ending in '" << extension << "' were found." << std::endl; 
    //} 


} 

Antwort

0

Ohne Zugriff auf die JSON-Bibliothek kann ich Ihnen auch nicht viel helfen, aber der erste offensichtliche Platz für potentielle Abstürze würde if (fname.find(extension, (fname.length() - extension.length())) != string::npos) sein. Sie müssen sicherstellen, dass Ihr Dateiname länger ist als die Größe Ihrer Erweiterung, bevor Sie diesen Anruf tätigen.

Auch für extrem tiefe Verzeichnisbäume sollten Sie eine Rekursion begrenzen, und alle Betriebssysteme, die ich kenne, haben eine Art Zeichenbeschränkung für Verzeichnis- und Dateinamen.

+0

Danke, dass Sie richtig sind, als ich die Art und Weise geändert habe, wie die Dateinamen normal funktionieren. aber jetzt Wie kann ich über eine Reihe von Dateien innerhalb eines Verzeichnisses iterieren? – Mohamed