ifstream und struct dirent *entry;



  • Hallo,
    ich lese eine Verzeichnisliste mit

    struct dirent *entry;
    hdir = opendir("/Users/edwin/Desktop/tmp/floppies/convert/");entry = readdir(hdir);

    ein.

    Ich kann eine Verzeinisliste auch ausgeben (zzgl while schleife).

    cout << (*entry).d_name << endl;

    Wenn ich allerdings etwas versuche wie:

    ifstream file(entry->d_name);
    if (!file)
    cout << "Error";

    Erhalte ich Error zurück.

    Wie kann ich denn dieses hier

    struct dirent *entry;

    in eine Variable vom Typ umwandeln.

    Gruss

    EJ


  • Administrator

    1. Was ist opendir/readdir? Das ist mal sicher kein Standard C++.
    2. Mit einem Filestream, kann man ein File, also eine Datei lesen, aber sicher kein Verzeichnis.
    3.

    Wie kann ich denn dieses hier

    struct dirent *entry;

    in eine Variable vom Typ umwandeln.

    Keine Ahnung was dirent für ein struct ist. Sieht nach einem C-Konstrukt aus, wenn du struct davor schreibst, denn das ist in C++ nicht nötig. Und in welchen Typ willst du es umwandeln?

    Grüssli


  • Administrator

    forum lag



  • Hallo,
    danke für die Antwort.

    1. Was ist opendir/readdir? Das ist mal sicher kein Standard C++.

    Dient dazu in einem Ordner alle Dateien anzeigen zu lassen. Zum Thema Standard "considered "pseudo-standard" and is reliably portable between platforms" Siehe auch:

    http://en.wikipedia.org/wiki/Dirent.h

    2. Mit einem Filestream, kann man ein File, also eine Datei lesen, aber sicher kein Verzeichnis.

    Das stimmt natürlich. In dem Verzeichnis befinden sich allerdings Dateien (bis auf . und ..). Diese Dateien möchte ich nach einander ansprechen.

    ----
    #include <iostream>
    #include <fstream>
    #include <dirent.h>

    using namespace std;

    int main()
    {
    DIR *hdir;
    struct dirent *entry;
    hdir = opendir("/your/path");
    string zeile;
    do
    {
    entry = readdir(hdir);
    if (entry)
    {
    cout << (*entry).d_name << endl;
    }
    ifstream file(entry->d_name);
    if (!file)
    cout << "Error";
    do {
    getline(file, zeile);
    cout << zeile << "Test" << endl;
    }
    while ( file.eof() );
    }
    while (entry);

    closedir(hdir);
    }
    ----

    Ich möchte es in einen Typ umwandeln, den ich mit ifstream verwenden kann. Also char wäre gut, string geht auch. Ich habe auch schon probiert die Information welche Dateien sich in einem Verzeichnis befindet mit getline in den Griff zu bekommen. Geht alles nicht.



  • Was bedeutet das? Bin erst seit heute hier angemeldet.


  • Administrator

    Ok, danke für den Wikipedia-Artikel. Dann ist dirent.h aber ein Pseudo-Standard für C. Wir sind hier aber in C++, dürfte ich daher vielleicht eine alternative in C++ vorschlagen? Die Bibliothek ist nämlich so ein Pseudo-Standard für C++ 🙂
    http://www.boost.org/
    Bzw. für dein Problem dann dies:
    Boost.Filesystem

    Wie dirent.h funktioniert, habe ich keine Ahnung. Ich würde auch nicht C-Funktionen mit C++ mischen. Entweder in C oder aber in C++ programmieren.

    Forum lag bedeutet, dass das Forum momentan ein paar Aufhänger hat. Die Admins und Mods arbeiten daran und haben bereits einiges verbessert. Das Forum wird halt langsam ein wenig gross 🙂

    Grüssli


Anmelden zum Antworten