2016-09-12 2 views
0

Ich habe Probleme herauszufinden, wie man eine Datei mit einer close-Funktion für eine Datei, die ich in einer separaten Funktion geöffnet habe, schließen. Im Moment besteht mein Programm hauptsächlich aus 3 Funktionen, create, open und close. Erstellen und Öffnen funktionieren gut, aber nachdem ich die Datei geöffnet habe und zurück zu meinem Optionsmenü gehe, versuche ich, die Datei ohne Benutzereingaben zu schließen. Ich möchte, dass die Close-Funktion erkennt, welche Datei geöffnet ist, und schließe sie. Es sollte immer nur eine Textdatei in meinem open geöffnet sein (die ich nicht programmieren konnte, aber ich nehme an, dass die Arbeit die gleiche war wie die Close-Funktion). Hier ist mein Code unten, es gibt andere Funktionen, die ich noch implementieren muss, aber ich mache mir nur Sorgen um die ersten drei. Danke für jede Hilfe!Datei-E/A zwischen mehreren Funktionen C++

#include <iostream> 
#include <fstream> 
#include <stdio.h> 

using namespace std; 

void createDB() { 
    ofstream db; 
    string fileName; 

    cout << "Enter the name of the database you want to create: \n"; 
    getline (cin, fileName); 

    string fullFile = fileName + ".txt"; 

    std::ifstream fin(fullFile); 

    if(fin.good()){ // means filename already exists 
     cout << "\nCould not create database because database name " << fullFile << " is already taken\n"; 
    } 
    else{ // creates file 
     cout << "\nYour database " << fullFile << " was created successfully\n"; 
     db.open(fullFile); 
    } 

    db.close(); 
} 

void openDB() { 
    // need to add check to see if one is already open 
    string fileName; 

    cout << "Enter the name of the database you want to open: \n"; 
    getline (cin, fileName); 

    string fullFile = fileName + ".txt"; 

    std::ifstream db(fullFile); 

    if(db.good()){ // means file exists 
     cout << "\nThe database " << fullFile << " has been opened successfully\n"; 
     db.open(fullFile); 
    } 

    else{ // there is no file named that to open 
     cout << "\nThere is no database named " << fullFile << " to open\n"; 
    } 
} 


void closeDB() { 

    cout << "The database _______ has been closed successfully"; 
} 

void display() { 
    cout << "Enter the ID of the employee you want to display: \n"; 
} 

void update() { 

} 

void report() { 

} 

void add() { 

} 

void del() { 

} 

int menu() { 
    cout << "Enter the number of the operation you wish to perform (1-9)\n" 
    << "1. Create new database\n" 
    << "2. Open database\n" 
    << "3. Close database\n" 
    << "4. Display record\n" 
    << "5. Update record\n" 
    << "6. Create report\n" 
    << "7. Add a record\n" 
    << "8. Delete a record\n" 
    << "9. Quit\n"; 

    int sel = 0; 
    (std::cin >> sel).ignore(); 

    switch (sel) { 
     case 1: createDB(); 
      menu(); // after creating file go back to list of options 
      break; 

     case 2: openDB(); 
      menu(); 
      break; 

     case 3: closeDB(); 
      menu(); 
      break; 

     case 4: display(); 
      break; 

     case 5: update(); 
      break; 

     case 6: report(); 
      break; 

     case 7: add(); 
      break; 

     case 8: del(); 
      break; 

     case 9: return 0; 
      break; 

     default: cout << "Please try again and enter a valid number\n\n"; 
      menu(); 
      break; 
    } 
    return true; // to avoid error saying control may reach end of non-void function 
} 


int main() { 

    menu(); 

return 0; 
} 
+0

Es gibt keine einfache nicht-Betriebssystem-spezifische Art und Weise zu tun, was Sie tun möchten, und selbst wenn, wäre es viel besser zu verfolgen, welche Datei Sie geöffnet hatten. Eine Variable mit Dateiumfang würde jetzt ausreichen, würde ich vorschlagen. –

+0

@ KenY-N wie eine globale Variable, die eine Zeichenfolge ist und setzen, dass was auch immer der Dateiname von openDB() ist? dann diese globale Variable in schließen und diese Datei schließen? Würde ich das über Parameter tun? – softballgirl12

+0

Sie können es auch mit Parametern tun, anstatt eine globale; Ein Global ist einfacher, aber die Parameter sind flexibler. Persönlich gesprochen, würde ich die Datenbank behandeln (Datei-Handle) eine globale für ein einfaches Programm wie folgt. –

Antwort

0

Sie müssen den Dateideskriptor von der geöffneten Datei erhalten. c Stil: DATEI * myfile; myfile = fopen (myfile, "r"); Sie können weiter lesen: http://www.cprogramming.com/tutorial/cfileio.html (ich denke, dass in c ist es leichter zu verstehen und es funktioniert auch in C++). http://www.cprogramming.com/tutorial/lesson10.html Er erklärt es sehr gut.

Aber Sie sollten sich erinnern: 1) Sie müssen einen Zeiger erstellen (dies ist die einzige Möglichkeit, die Daten nicht verloren gehen). 2) Sie müssen den Deskriptor senden/empfangen

Verwandte Themen