2016-08-30 3 views
0

IN IOS-Anwendung, in C++ geschriebenes Modul Ich schreibe meine Daten (Zuordnung von Grundzeichenfolgen und Ganzzahlen) in eine Textdatei. Mit folgenden Methode:IOS-Textdatei ist nach scheinbar erfolgreichem Schreiben leer

bool Recognizer::saveMap(const char * s) 
{ 
if(trainingData.model && !trainingData.model.empty()) { 
    const string filename = string(s); 
    std::ofstream file(s, ios_base::trunc); 

    try{ 
     if(! file.is_open()) 
     { 
      file.open(s); 
     } 
     for (map<String,int>::iterator it=trainingData.idMap.begin(); it!=trainingData.idMap.end(); ++it) 
     { 
      cout << it->second << " " << it->first << endl; 
      file << it->first << endl << it->second << endl; 
     } 
     file.close(); 
    } 
    catch(cv::Exception & e){ 
     if(file.is_open()) 
      file.close(); 
     int code = e.code; 
     string message = e.err; 

     cerr << "cv::Exeption code: " << code << " " << message << endl; 
     return false; 
    } 
    std::streampos fileLength = iosFileSize(s); 
    cout << "Saved map to: " << filename << " length: " << fileLength << endl; 
    return true; 
} 
return false; 
} 

Mein enthält einen Eintrag und Konsolenausgabe zeigt an, dass zwei Linien: String, String, die Nummer hat meine Datei geschrieben. anschließende Öffnen der Datei zum Lesen und Lesen mit getline oder Stream-Operator zeigt an, dass Datei leer ist:

bool Recognizer::loadMap(const char * s) 
{ 
    std::streampos fileLenght = iosFileSize(s); 
    std::ifstream file(s, ios::in); 

    try{ 
     if(file.is_open()) 
     {   
      string name; 
      string lineName; 
      string lineTag; 
      int tag; 
      int count = 0; 

      while(getline(file,name)) 
      { 
       if(getline(file,lineTag)) 
       { 
        tag = stoi(lineTag,0,10); 
        count++; 
        cout << tag << " " << name << endl; 
        trainingData.idMap[name]=tag; 
        trainingData.namesMap[tag]=name; 
       } 
      }trainingData.personsCount=count; 
      file.close(); 
      } 
     } 
     catch(cv::Exception & e){ 
      if(file.is_open()) 
       file.close(); 
      int code = e.code; 
      string message = e.err; 

      cerr << "cv::Exeption code: " << code << " " << message << endl; 
      return false; 
     } 
    cout << "Loaded map from: " << s << " lenght: "<< fileLenght << endl; 
    return true; 
} 

ich auch von einem Stackoverflow Antwort Methode kopiert Dateilänge Rückkehr und deren Verwendung lenghth die Datei nach dem Schreiben zu überprüfen Betrieb:

std::streampos iosFileSize(const char* filePath){  
    std::streampos fsize = 0; 
    std::ifstream file(filePath, std::ios::binary); 
    fsize = file.tellg(); 
    file.seekg(0, std::ios::end); 
    fsize = file.tellg() - fsize; 
    file.close(); 

    return fsize; 
} 

Der Pfad zur Datei saveMap und loadMap vergangen scheint echt zu sein. Mit Pfad, in den die App nicht schreiben konnte, versuche, verursachte Ausnahme zu schreiben.

Es gibt keine Fehler, die vom Schreibvorgang zurückgegeben werden, aber beide Versuche, iosFileSize() zu lesen, zeigen an, dass die Datei leer ist. Ich bin mir nicht sicher, ob ich file.open() und file.close() aufrufen muss oder die Datei wird automatisch geöffnet und geschlossen, wenn der Ausgabestream erstellt wird und später den Gültigkeitsbereich verlässt. ich mit denen, mit dem gleichen Ergebnis experimentiert (Aufruf kehrt file.is_open wahr, so dass der Block Aufruf file.open() übersprungen.

Was mache ich falsch? ich alle Antworten zu schätzen wissen.

+0

Und wenn Sie die Datei ansehen, wie groß ist die Datei? Nein, nicht was dein Programm dir sagt. Was dein Betriebssystem dir sagt. –

+0

Ich wünschte, ich wüsste, wie man Verzeichnisse auf dem iPhone sieht. Gibt es irgendeine Konsole, auf der ich Unix-Befehle wie ls -l ausführen könnte? – Marek

Antwort

-1

I glauben, aus der Betrachtung der Code, den Sie Ihre Daten überschreiben, wenn Sie die Datei in dem zweiten Programm öffnen, sollten Sie so etwas wie dieses werden.

std::fstream fs; 
    fs.open ("test.txt", ios::app) 

stattdessen die ios tun :: in

+0

Danke, ich muss mich mit der Bedeutung aller Stream-Argumente vertraut machen. Ich muss das noch ausprobieren, weil die andere Lösung funktioniert hat. – Marek

1

Es scheint nicht so, als ob Sie file.flush(); irgendwo in Recognizer::saveMap() nach dem Schreiben in den Dateistream aufrufen. std::ofstream::flush() speichert Änderungen, die Sie an der Datei vorgenommen haben. Fügen Sie file.flush(); hinzu, wenn Sie Änderungen am Code vornehmen und wenn Sie die Datei schließen. Sehen Sie, ob das Ihr Problem behebt.

+0

Vielen Dank, file.flush() hat das Problem behoben. – Marek

Verwandte Themen