2017-08-05 3 views
-2

Je suis en train de créer un programme d'inventaire. Nécessité d'inclure ios :: app pour ne pas surcharger les données du fichier inventory.txt comme le fait ios :: out, mais lorsque j'ai ajouté les données de l'application ios :: read a été corrompue/corrompue.C++ fstream lecture du fichier donnant des ordures

Je pense que le problème se résume à cette ligne: outfile.open ("inventory.txt", ios :: out | ios: app | ios :: binary);

J'ai collé la fonction me donner des problèmes ci-dessous.

Merci!

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

Votre utilisation ofstream .... pas ifstream .... –

+0

Votre titre dit « lire le fichier » votre code écrit à un !? En outre, quelle est la déclaration de 'Item', j'ai la suspicion furtive thats ce n'est pas un POD à quel point vous ne pouvez pas l'écrire dans un fichier comme vous le faites maintenant. – Borgleader

+0

Hé les gars, Ouais mais le problème que je pense se produit lorsque j'écris les données. J'ai une fonction display() que j'appelle après cela et elle commence seulement à afficher des ordures après avoir ajouté ios :: app – Kubie

Répondre

0

Pour résoudre ce problème, je devais appeler le ios::ate au lieu du drapeau ios::app. J'ai également dû utiliser le type de données fstream plutôt que le type de données ofstream, même si j'écris uniquement dans le fichier.

est ici plus en détail sur la façon dont ce problème peut être analysé les causes: Opening a binary output file stream without truncation