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;
}
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. –
@ 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
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. –