2016-11-26 1 views
0

Je dois donc créer un programme bancaire pour une tâche, et mon professeur veut un fichier journal de chaque "opération" (Il était vraiment vague à ce sujet, j'ai décidé d'enregistrer les entrées et les sorties). Le problème que je rencontre est que chaque fois que j'appelle une nouvelle fonction, je dois rouvrir le fichier et écraser ce qui était précédemment là. Autant que je sache, l'utilisation répétée de .open fera que la fonction que j'utilise ignorera la sortie précédente.
J'ai essayé de déclarer un ofstream global en espérant qu'il changerait, mais le problème persiste de toute façon. Le rinçage et/ou la fermeture ne semblaient pas aider, mais il est tout à fait possible que je les ai mal utilisés ou que la syntaxe soit erronée. Le code ci-dessous est la fonction principale, la fonction read_accts et la fonction de menu. Si je termine le programme avant d'appeler la fonction read_accts, le fichier journal aura "Combien de comptes y a-t-il?" Mais si j'autorise le programme à appeler les deux autres fonctions, alors le fichier journal n'a que la sortie du fichier menu. Je m'excuse pour le long poste, mais je ne sais pas ce qui ne va pas.Fichier Ofstream écrasé dès qu'il est ouvert

int main() 
{ 
    ofstream log; 
    log.open("Log.txt"); 
    int MAX_NUM = 100; 
    BankAccount account[MAX_NUM]; 
    int num_accts = 0; 
    char selection = 'Z'; 
    cout << "How many accounts are there?" << endl; 
    log << "How many accounts are there?" << endl; 
    cin >> MAX_NUM; 
    read_accts(account, MAX_NUM, num_accts); 
    cout << endl; 
    cout << "There are " << num_accts << " accounts" << endl; 
    log << "There are " << num_accts << " accounts" << endl; 
    cout << endl; 
    print_accts(account, MAX_NUM); 
    cout << endl; 
    ` 

    while (selection != 'Q' && selection != 'q') 
    { 

     menu(); 
     cin >> selection; 
     log << selection; 
     switch (selection) 
     { 
      case 'W': 
       case 'w': 
       withdrawal(account, num_accts); 
       break; 
      case 'D': 
       case 'd': 
       deposit(account, num_accts); 
       break; 
      case 'N': 
       case 'n': 
       new_acct(account, num_accts); 
       break; 
      case 'B': 
       case 'b': 
       balance(account, num_accts); 
       break; 
      case 'I': 
       case 'i': 
       account_info(account, num_accts); 
       break; 
      case 'C': 
       case 'c': 
       close_acct(account, num_accts); 
       break; 
      case 'Q': 
       case 'q': 
       print_accts(account, num_accts); 
       break; 
      default: 
       cout << "Invalid selection" << endl; 
       log << "Invalid selection" << endl; 

     } 
     cout << endl; 
    } 
    print_accts(account, MAX_NUM); 
    cout << "Goodbye" << endl; 
    log.close(); 
    return 0; 
} 

int read_accts(BankAccount account[], int MAX_NUM, int &num_accts) 
{ 
    ofstream log; 
    log.open("log.txt", std::ofstream::app); 
    string f; 
    string l; 
    int social; 
    int acct; 
    string type; 
    double bal; 
    int i = 0; 
    ifstream readfile; 
    readfile.open("bankdatain.txt"); 
    if (!readfile) 
    { 
     cout << "Can't open input file." << endl; 
     log << "Can't open input file." << endl; 
     exit(1); 
    } 
    while (readfile >> f >> l >> social >> acct >> type >> bal) 
    { 
     account[i].setfname(f); 
     account[i].setlname(l); 
     account[i].setssnum(social); 
     account[i].setacctnum(acct); 
     account[i].settype(type); 
     account[i].setbalance(bal); 
     i++; 
     num_accts++; 
    } 

    return num_accts; 
} 

void menu() 
{ 
    ofstream log; 
    log.open("Log.txt"); 
    cout << "W - Withdrawal" << endl; 
    log << "W - Withdrawal" << endl; 
    cout << "D - Deposit" << endl; 
    log << "D - Deposit" << endl; 
    cout << "N - New account" << endl; 
    log << "N - New account" << endl; 
    cout << "B - Balance" << endl; 
    log << "B - Balance" << endl; 
    cout << "I - Account Info" << endl; 
    log << "I - Account Info" << endl; 
    cout << "C - Close Account" << endl; 
    log << "C - Close Account" << endl; 
    cout << "Q - Quit" << endl; 
    log << "Q - Quit" << endl; 
    cout << "Please make your selection: " << endl; 
    log << "Please make your selection: " << endl; 
} 
+0

Vous pouvez simplement ouvrir le fichier en mode append. http://www.cplusplus.com/reference/fstream/fstream/open/ –

Répondre

0

Pour autant que je sache, par défaut, ofstream va ouvrir le fichier dans std :: :: fstream en mode, si effacera le fichier existe ou créer un nouveau fichier.

changement à std :: fstream :: app http://www.cplusplus.com/reference/fstream/fstream/open/

Modifié: comme vous utilisez Semblent deux ostream à un seul fichier. Il ne peut pas refuser l'accès Using std:fstream how to deny access (read and write) to the file

passer le ostream à fonction appelée

int read_accts(BankAccount account[],int MAX_NUM,int &num_accts, ostream& log) 
{ 
log.open("log.txt",std::ofstream::app); // remove this line since you already open it in main() 

en appeler dans le principal

read_accts(account,MAX_NUM,num_accts, log); 
+0

Fstream ne fait pas de différence, est-il possible que l'utilisation de "file.open" dans main(), puis de l'utiliser à nouveau dans une autre fonction provoque le problème? Je suppose que je cherche un moyen de garder le fichier ouvert à travers chaque fonction, si c'est possible. –

+0

@CharlieMonnone Mis à jour! –

+0

La transmission d'un journal en tant que paramètre ne semble pas fonctionner; autant que je peux dire une fois que j'appelle la fonction read_accts ofstream cesse de fonctionner. –

0

Je pense que votre seul problème est que vous devez ajouter ceci avant que vous écrivez dans le fichier.

log.seekp(0, std::ios_base::end);

cela va régler le pointeur de fichier à la fin du fichier et continuer à écrire à partir de là.

Votre fichier est déjà ouvert en int main() il sera mieux si vous passez la log variable dans la fonction int read_accts(BankAccount account[], int MAX_NUM, int &num_accts) et de le rendre int read_accts(BankAccount account[], int MAX_NUM, int &num_accts, ofstream log);

et faire sa définition

int read_accts(BankAccount account[], int MAX_NUM, int &num_accts, ofstream log) 
{ 
    string f; 
    string l; 
    int social; 
    int acct; 
    string type; 
    double bal; 
    int i = 0; 
    ifstream readfile; 
    readfile.open("bankdatain.txt"); 
    if (!readfile) 
    { 
     cout << "Can't open input file." << endl; 
     log << "Can't open input file." << endl; 
     exit(1); 
    } 
    while (readfile >> f >> l >> social >> acct >> type >> bal) 
    { 
     account[i].setfname(f); 
     account[i].setlname(l); 
     account[i].setssnum(social); 
     account[i].setacctnum(acct); 
     account[i].settype(type); 
     account[i].setbalance(bal); 
     i++; 
     num_accts++; 
    } 

    return num_accts; 
} 

PS syntaxe seekp() est

ostream& seekp (streampos pos); 
    ostream& seekp (streamoff off, ios_base::seekdir way); 

se réfèrent here

PS son équivalent pour ifstream est seekg (0, std::ios_base::end)