2 Pluspunkte 0 Minuspunkte

Wie kann ich mehrere ifstream Objekte in einem Vector speichern?

#include <iostream>
#include <fstream>
#include <string>

int main() {

    std::string dateiname = "datei.txt"; 
    std::ifstream datei(dateiname);    

    if (!datei.is_open()) {
        std::cerr << "Fehler beim Öffnen der Datei: " << dateiname << std::endl;
        return 1;
    }

    std::string zeile;
    while (std::getline(datei, zeile)) { 
        std::cout << zeile << std::endl; 
    }

    datei.close();
    return 0;

}
von  

1 Antwort

0 Pluspunkte 0 Minuspunkte

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.
von (868 Punkte)