2017-08-05 1 views
-2

Ich versuche, ein Inventar-Programm zu erstellen. Sie müssen ios :: app hinzufügen, um Daten in der Datei inventory.txt nicht wie bei ios :: out zu überschreiben, aber wenn ich ios :: app hinzugefügt habe, werden die Daten in beschädigter/müll gelesen.C++ fstream lesen von Datei geben Müll

Ich denke, das Problem läuft auf diese Zeile herunter: outfile.open ("inventory.txt", ios :: out | ios: app | ios :: binary);

Ich habe die Funktion eingefügt, die mir unten Probleme gibt.

Danke !!

void add() { 

    Inventory Item; 
    int recnum; 
    ofstream outfile; 

    // opening file 
    outfile.open("inventory.txt", ios::out | ios:app | ios::binary); 

    if (outfile.fail()) 
     cout << "\nFile failed to open" << endl; 

    cout << "\nPlease enter the record ID to be added (will overwrite duplicates) : "; 
    cin >> recnum; 
    cout << "\n" << recnum << " has been set as the record ID for this item." << endl; 

    cout << "Please enter item description in 50 characters or less : "; 
    cin.ignore(); 
    cin.getline(Item.description, size); 

    // do-whiles below are for looping for input validation 
    do { 
     cout << "Please enter the number of items on hand : "; 
     cin >> Item.quantity; 
     if (Item.quantity < 0) 
      cout << "Please enter a valid number." << endl; 
    } while (Item.quantity < 0); 

    do { 
     cout << "Please enter the wholesale price for this item : "; 
     cin >> Item.wholesale; 
     if (Item.wholesale < 0.01) 
      cout << "Please enter a valid number." << endl; 
    } while (Item.wholesale < 0.01); 

    do { 
     cout << "Please enter the retail price for this item : "; 
     cin >> Item.retail; 
     if (Item.retail < 0.01) 
      cout << "Please enter a valid number." << endl; 
    } while (Item.retail < 0.01); 

    // couldn't figure out how to perform input validation for date 
    cout << "Please enter the date this item was added (format: mm/dd/yyyy) : "; 
    cin.ignore(); 
    cin.getline(Item.dateadded, datesize); 

    // finding position in file, writing to file, closing file 
    outfile.seekp(recnum*sizeof(Item), ios::beg); 
    outfile.write(reinterpret_cast<char *>(&Item), sizeof(Item)); 
    outfile.close(); 

} 
+0

Ihre Verwendung ofstream .... nicht ifstream .... –

+0

Ihr Titel sagt Ihr Code „aus Datei lesen“, schreibt einen !? Auch was die Erklärung von 'Item' betrifft, habe ich den schleichenden Verdacht, dass es kein POD ist, an welchem ​​Punkt du es nicht in eine Datei schreiben kannst, wie du es jetzt tust. – Borgleader

+0

Hey Leute, Ja, aber das Problem, denke ich, tritt auf, wenn ich die Daten schreibe. Ich habe eine display() -Funktion, die ich danach aufrufen und es beginnt nur Anzeige von Müll, nachdem ich hinzugefügt ios :: app – Kubie

Antwort

0

Um dieses Problem zu beheben, hatte ich die ios::ate anstelle der ios::app Flagge zu nennen. Ich musste auch den fstream Datentyp anstelle des ofstream Datentyps verwenden, selbst wenn ich nur in die Datei schreibe.

Hier weitere Details zu ist, wie dieses Problem kann behoben werden: Opening a binary output file stream without truncation