Beim Hinzufügen von Objekten in einen std::vector erstellst du Kopien der Objekte. Da ifstream keine Kopierkonstruktoren hat, musst du den std::vector mit Zeigern auf ifstream oder mit std::unique_ptr (für automatische Speicherverwaltung) arbeiten.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <memory>
int main() {
std::vector<std::unique_ptr<std::ifstream>> dateien;
std::vector<std::string> dateinamen = {"file1.txt", "file2.txt", "file3.txt"};
// Dateien öffnen und in den Vector speichern
for (const auto& dateiname : dateinamen) {
auto datei = std::make_unique<std::ifstream>(dateiname);
if (!datei->is_open()) {
std::cerr << "Fehler beim Öffnen der Datei: " << dateiname << std::endl;
return 1;
}
dateien.push_back(std::move(datei)); // Datei in den Vector einfügen
}
// Alle geöffneten Dateien zeilenweise auslesen
for (size_t i = 0; i < dateien.size(); ++i) {
std::string zeile;
std::cout << "Inhalt von " << dateinamen[i] << ":\n";
while (std::getline(*dateien[i], zeile)) {
std::cout << zeile << std::endl;
}
std::cout << "\n";
}
// Dateien werden automatisch geschlossen, wenn der Vector zerstört wird
return 0;
}
Verwende std::unique_ptr um den Speicher für die ifstream Objekte automatisch zu schließen wenn das unique_ptr aus dem vector entfernt oder der vector zerstört wird.
- std::vector<std::unique_ptr<std::ifstream>> ist ein Vektor, der Zeiger auf std::ifstream-Objekte enthält.
- std::make_unique<std::ifstream>(dateiname) erstellt ein neues ifstream Objekt und gibt einen Zeiger darauf zurück.
- std::move(datei) verschiebt den std::unique_ptr in den Vektor, da unique_ptr nicht kopiert werden kann.