0 Daumen
229 Aufrufe

Frage:

Programmiersprache C

Hallo, ich möchte gerne in einem "dynamischen Struktur Array " die aktuellen Dateinamen speichern die sich in dem aktuellen Ordner befinden. Dafür zähle ich in der ersten While Schleife die Anzahl der Dateien, die sich im Ordner befinden. Danach in der zweiten Schleife reserviere ich Speicher und speichere die Namen der Dateien in der Member Variable aktuellerName. Leider funktioniert dies nicht. Kann mir jemand sagen was ich da falsch mache? Danke!


Code:

#include<stdio.h>
#include<dirent.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

typedef struct{

  char *aktuellerName;

}GefundeneDateinamen;

int main(void)
{


//----------------------
  int file_count = 0;
  DIR * dirp;
  struct dirent * entry;

  dirp = opendir(".");
  // While Scchleife Wird verwendet um die Anzahl der Dateien, im Ordner, zu zählen
  while ((entry = readdir(dirp)) != NULL) {
       
              file_count++;
         
      }
  closedir(dirp);

//Mit file_count ist nun klar wieviele Dateien sich im Ordner befinden.

  DIR *d;
  d = opendir(".");
  int count = 0;
  struct dirent *dir;
  // Dynamische allokation von der Struktur GefundeneDateinamen
  GefundeneDateinamen *gefundeneDateinamen = (GefundeneDateinamen*)(malloc(file_count * sizeof(GefundeneDateinamen)));

      while ((dir = readdir(d)) != NULL)
      {

              gefundeneDateinamen->aktuellerName = (char*)malloc(sizeof(char)*(strlen(dir->d_name)+1)); // Dynamische allokation von aktuellerName
              strncpy (gefundeneDateinamen[count].aktuellerName,dir ->d_name, strlen(dir->d_name) );
              gefundeneDateinamen[count].aktuellerName[strlen(dir->d_name) - 1] = '\0'; // Null Terminierungszeichen am Ende vom String einfügen
              printf("%s\n",gefundeneDateinamen[count].aktuellerName );
          count++;

      }
      closedir(d);


  return(0);
}
Avatar von

1 Antwort

0 Daumen

Angenommen es befinden sich 15 Dateien im aktuellen Verzeichnis.

closedir(dirp);

Jetzt hat die Variable file_count den Wert 15.

Angenommen jetzt erstellt jemand eine neue Datei im aktuellen Verzeichnis.

GefundeneDateinamen *gefundeneDateinamen = (GefundeneDateinamen*)(malloc(file_count * sizeof(GefundeneDateinamen)));

Jetzt hast du Speicher für ein 15-elementiges Array mit Werten vom Typ GefundeneDateinamen.

gefundeneDateinamen->aktuellerName = (char*)malloc(sizeof(char)*(strlen(dir->d_name)+1));

Du wolltest doch gefundeneDateinamen als Array verwenden.

Deshalb gefundeneDateinamen[count].aktuellerName = ...

strncpy (gefundeneDateinamen[count].aktuellerName,dir ->d_name, strlen(dir->d_name) );

Verwende strcpy. Die Funktion strncpy ist dann sinnvoll, wenn du nur einen Teil des Strings kopieren willst oder wenn die Quelle nicht nullterminiert ist.

Damit behebst du auch gleichzeitig den Fehler, dass das letzte Zeichen des Dateinamens abgschnitten wird.

while ((dir = readdir(d)) != NULL)

Unter den obigen Annahmen werden 16 Einträge eingelesen, du hast aber nur Speicher für 15 Einträge reserviert. Siehe Time-of-Check-to-Time-of-Use-Problem.

Avatar von 5,7 k

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community