2017-03-06 3 views
0

Ich versuche, eine Datei-basierte Programm, wo ein Benutzer Zeichenfolgen eingeben können, und das Programm würde es in einer .bin-Datei im Hauptverzeichnis speichern.C++ fread String fehlende erste Zeichen auf der Konsole Ausgabe

Das ist, was ich habe zur Zeit:

#include <ostream> 
#include <string> 
#include <cstdio> 
#include <iostream> 

using std::string; 
using std::cout; 

class Ingredient { 
private: 
    FILE *file; 
    string name; 
    int nmLen; 
    float calories; 
    float fat; 
    float carb; 
    float protein; 
    float fiber; 
    void writeInfo() { 
     nmLen = sizeof(name); 
     std::fseek(file, 0, SEEK_SET); 
     std::fwrite(&nmLen, sizeof(int), 1, file); 
     std::fwrite(&name, sizeof(name), 1, file); 
     nmLen = 0; 
     name = ""; 
    } 
    string readInfo() { 
     std::fseek(file, 0, SEEK_SET); 
     std::fread(&nmLen, sizeof(int), 1, file); 
     std::fread(&name, nmLen, 1, file); 
     return name; 
    } 
public: 
    Ingredient(const string &nm, const float &cal, const float &cb, const float &prot, const float &fib) { 
     file = std::fopen((nm+".bin").c_str(), "rb+"); 
     name = nm; 
     calories = cal; 
     carb = cb; 
     protein = prot; 
     fiber = fib; 
     if (file == nullptr) { 
      file = fopen((nm+".bin").c_str(), "wb+"); 
      writeInfo(); 
      cout << readInfo() << "\n"; 
     } 
     else { 
      writeInfo(); 
      cout << readInfo() << "\n"; 
     } 
    } 
}; 

int main() { 
    string v1 = "Really Long String Here"; 
    float v2 = 1.0; 
    float v3 = 2.0; 
    float v4 = 3.0; 
    float v5 = 4.0; 
    Ingredient tester(v1, v2, v3, v4, v5); 
} 

Am Anfang der .bin-Datei ein int Ich speichere die Länge oder Größe der Zeichenfolge so gespeichert, um anzuzeigen, wenn ich fread nenne es würde die gesamte nehmen Zeichenfolge. Wenn ich jetzt versuche, zu testen, ob ich Strings in eine Datei schreibe, würde sie es passend zurückgeben. Aber was ich von der Konsole Ausgabe von meinem Konstruktor bekommen, ist dies:

eally Long String Here 

Hinweis, dass es tatsächlich ein leerer Raum, der das Zeichen ‚R‘ gedruckt haben soll. Liegt das möglicherweise daran, dass ich nicht richtig fese?

+0

Jedes Mal, wenn Sie eine Leseoperation von jeder Art durchführen, müssen Sie immer prüfen, ob die Lese erfolgreich war, und handhaben irgendwie jeden Fehler. –

+0

erste Frage - enthält die Datei die richtigen Daten? – pm100

+0

Sie können eine 'Zeichenfolge' auf diese Weise nicht serialisieren/deserialisieren. –

Antwort

2

sicher ist das falsch std::fwrite(&name, sizeof(name), 1, file);.

Sie benötigen

std::fwrite(name.c_str(), name.length(), 1, file);