# Name einer Datei aussuchen



## Paper (24. November 2011)

Guten Morgen ihr Programmier meister 
Mein Titel erklärt mein Problem jetzt nicht wirklich, mir ist aber kein besserer Titel eingefallen 

Meine Frage ist folgendes. Ich gebe mal ein Beispiel.

Wir haben ein Programm das uns eine Logdatei ausließt diese verändert und wieder abspeichert. 

Meine Frage ist jetzt.
Ist es möglich das der Name der Datei nicht fest im Quellcode gegeben ist, sondern der User einen Namen angeben kann wie die Datei heißen soll? 
Zum Beispiel *acces%heutigesDatum%.log* oder so

Mit freundlichen Grüßen
Paper


----------



## sheel (24. November 2011)

Hi

natürlich ist das möglich.
Welche Programmart ist es denn (Konsole?)

Und seoll der Benutzer wirklich "%heutigesDatum%" oÄ. eingeben,
dass dann durch das echte Datum ersetzt wird,
oder war das jetzt nur im Forum als Platzhalter gedacht?


----------



## Paper (24. November 2011)

Hallo sheel,

Ja genau es ist in einer Konsole 

%heutigesDatum% war als PLatzhalter gedacht, hab es doof erklärt. 
Das die Eingabe z.B "Acces" ist und das heutige Datum wird halt automatisch dahinter gehangen für jeden Tag wo es gespeichert wird.


----------



## sheel (24. November 2011)

Ah, Moment.
Ich glaub, hab was falsch verstanden.

Du willst keinen Log erstellen, sondern eine vorhandene Datei auslesen?
Bzw. mehrere alte Dateien von verschiedenen Zeitpunkten?

In welchem Format ist denn das Datum?
Für 01.01.2000 "Acces01012000.log", oder ist da auch eine Uhrzeit dabei,
oder das Jahr zuerst, oder...?

Ist es für die erarbeitung wichtig, wann die Logdatei erstellt wurde,
oder ist das im Prinzip nur zum Datei-unterscheiden?


----------



## Jennesta (24. November 2011)

Hallo,
also ich würde es durch <string.h> und/oder <string> realisieren.
Die Uhrzeit dürftest du durch <time.h> bekommen, wenn nicht schon vorhanden.


----------



## Paper (24. November 2011)

Also ich habe ein Programm das einen Squid ausliesst nenn wir den "Squid1". Den Unix Timestamp der da drin steht den Wandelt er in ein Datum + Uhrzeit um. Soweit funktioniert es auch. Und diese Umwandlung schreibt er nochmal in eine andere txt Datei. Ich hab es aber nur so das es im Quellcode angegeben ist wie die Datei heißt. Ich zeige euch mal den Code.



```
//Festlegen des Pfades für die Output-Datei
  FILE *fileOutput;
  fileOutput = fopen("SquidNEU.log", "w");
 
 
 
  //Überprüfung, ob Datei vorhanden ist
  if(NULL == fileOutput) {
    fprintf(stderr, "Fehler beim Oeffnen ...\n");
    return EXIT_FAILURE;
  }
 
  //Festlegen des Pfades für die Input-Datei
  FILE *fileInput;
  fileInput = fopen("squid123.log", "r");
 
  //Überprüfung, ob Datei vorhanden ist
  if(NULL == fileInput) {
    fprintf(stderr, "Fehler beim Oeffnen ...\n");
    return EXIT_FAILURE;
```

und wie man sieht, bei der Output und Input Datei ist der Name fest angegeben. Meine frage halt ob es möglich ist dort den Namen Variabel zu machen=)




sheel hat gesagt.:


> In welchem Format ist denn das Datum?
> Für 01.01.2000 "Acces01012000.log", oder ist da auch eine Uhrzeit dabei,
> oder das Jahr zuerst, oder...?



Ja genau so kann man es machen wie du geschrieben hast "Access0101200.log" hauptsache das noch das Datum dabei steht 





Jennesta hat gesagt.:


> Hallo,
> also ich würde es durch <string.h> und/oder <string> realisieren.
> Die Uhrzeit dürftest du durch <time.h> bekommen, wenn nicht schon vorhanden.



Hmm..Nur ich weiß halt nicht wie ich es so hinkriege das es im Dateinamen steht..


----------



## sheel (24. November 2011)

Zuerst liest du mit gets das Wunsch-Präfix in ein zB. "char prefix[1024]" ein.
Kopier das mit strcpy in einen zweiten String (hier format)
und häng mit strcat "%8d.log" an format an.

Such mit FindFisrFile bzw. FindNextFile das ganze Verzeichnis durch.

Auf jeden Dateinamen machst du ein

```
sscanf(...dateiname..., format, &datum)
```
wobei datum ein int ist.
Wenn der Returnwert von sscanf 1 ist,
hast du eine passende Logdatei.

Verarbeiten.

Den neuen Dateinamen für die Ausgabedatei bekommst du mit

```
sprintf(x, "%s%8dNeu.log", prefix, datum);
```
in einen String x.


----------



## Paper (24. November 2011)

hmm ich weiß zwar was du meinst..aber mit der umsetzung klappts i.wie nicht...habe nicht wirklich 'ne Ahnung wie ich das da rein bringen soll :/


----------



## sheel (24. November 2011)

Warum zeigst du dann nicht deinen Versuch?


----------



## Paper (24. November 2011)

```
int logConvert()
{
//Wunsch-Präfix
char namee[1024]; 
char format;

//string kopieren
strcpy (format, namee);
strcat (format, "%8");

 
  //Zwischenspeicher fürs Einlesen
  char puffer[256];
  int line= sizeof(puffer);
 
  //Trennzeichen
  char del[]="\n";
 
  //Zählvariabeln
  int i =0;
 
  //Festlegen des Pfades für die Input-Datei
  FILE *fileOutput;
  fileOutput = fopen("SquidNEU.log", "w");
 
 
 
  //Überprüfung, ob Datei vorhanden ist
  if(NULL == fileOutput) {
    fprintf(stderr, "Fehler beim Oeffnen ...\n");
    return EXIT_FAILURE;
  }
 
  //Festlegen des Pfades für die Output-Datei
  FILE *fileInput;
  fileInput = fopen("squid123.log", "r");
 
  //Überprüfung, ob Datei vorhanden ist
  if(NULL == fileInput) {
    fprintf(stderr, "Fehler beim Oeffnen ...\n");
    return EXIT_FAILURE;
  }
 
  //solange Zeilen vorhanden sind wird eingelesen
  while(fgets (puffer, line, fileInput))
    {
/// neue Zeilen
      int len;
      int uxtime;
      if (sscanf(puffer, "%d.%*d%n", &uxtime, &len) >= 1) {
        fprintf(fileOutput, "%s %s", Unix2Date(uxtime, 1), puffer + len);
      }
////
    }
 
 
 
 
  //Schließen der Dateien
  fclose(fileInput);
  fclose(fileOutput);
}
```

habs nochmal versucht alles schritt für schritt und folgende Meldung bekomme ich 

213 [Warning] passing arg 1 of `strcpy' makes pointer from integer without a cast 
214 [Warning] passing arg 1 of `strcat' makes pointer from integer without a cast


----------



## Paper (29. November 2011)

Hey Sorry konnte die Tage nicht  aber jetzt wieder 
aufjedenfall hab ich was neues versucht grade



```
//Wunsch-Präfix
char prefix[1024];


//string kopieren und anhängen
strcpy (prefix, format);
strcat (format, "%8");
scanf ("Squid",format, &datum);

sprintf(x, "%s%8dNeu.log", prefix, datum);
```

dann meckert der das *format* nicht deklariert ist. Ist es nicht so das der nicht deklariert sein muss weil der Inhalt von *prefix* in *format* kopiert wird? oder versteh ich da i.was falsch?


----------



## deepthroat (29. November 2011)

Hi.

Alle Variablen die du verwendest müssen deklariert sein.

Gruß


----------



## Paper (29. November 2011)

deepthroat hat gesagt.:


> Hi.
> 
> Alle Variablen die du verwendest müssen deklariert sein.
> 
> Gruß


 
Achso ich hatte i.wo mal aufgeschnappt dases  bei strcpy und irgendwelchen anderen Befehlen nicht nötig wäre. Wenn ich diese Variable deklariere gibt er mir folgende Fehlermeldung aus. 

[Warning] passing arg 2 of `strcpy' makes pointer from integer without a cast 
[Warning] passing arg 1 of `strcat' makes pointer from integer without a cast  

Ich habe nur keine Ahnung wie ich das beheben kann 

Ich glaub ich weiß noch nichtmal wirklich was die meldung von mir will 
was für ein integer?  seh da keins :S


----------



## deepthroat (29. November 2011)

Paper hat gesagt.:


> [Warning] passing arg 2 of `strcpy' makes pointer from integer without a cast
> [Warning] passing arg 1 of `strcat' makes pointer from integer without a cast
> 
> Ich habe nur keine Ahnung wie ich das beheben kann


Was erwartet denn strcpy als zweiten Argument-Typ?

Was hast du stattdessen übergeben? :suspekt:


----------



## Paper (29. November 2011)

deepthroat hat gesagt.:


> Was erwartet denn strcpy als zweiten Argument-Typ?
> 
> Was hast du stattdessen übergeben? :suspekt:




```
//Wunsch-Präfix
char prefix;
char format, x, datum;

//string kopieren und anhängen
strcpy (prefix, format);
strcat (format, "%8");
scanf ("Squid.log",format, &datum);

sprintf(x, "%s%8dNeu.log", prefix, datum);
```
 
so sieht das aus =)


----------



## sheel (29. November 2011)

Der Code ist etwas seltsam...

Alle char sind nur Einzelbuchstaben.
Du brauchst char-Arrays.

Vor dem ersten strcpy muss format einen Inhalt haben.

strcat kann mit %8 nichts anfangen.
Was soll das überhaupt sein?

Das scanf darunter..."Squid.log" 
Hmm...vllt. mein Fehler.
Mit Dateiname meinte ich oben eigentlich den Namen der FILE-Variable.

Zumindest das sprintf leuchtet ein.


----------



## deepthroat (29. November 2011)

Paper hat gesagt.:


> so sieht das aus =)


Das war nicht die Frage.

Was erwartet die Funktion (da mußt du mal in die Referenz kucken!)?

Was hast du übergeben?

Warum kann das also nicht funktionieren?

Was mußt du ändern?

Aha.


----------



## Paper (29. November 2011)

Boa was bin ich für'n C n0ob haha 




sheel hat gesagt.:


> Der Code ist etwas seltsam...
> 
> Alle char sind nur Einzelbuchstaben.
> Du brauchst char-Arrays.



Char-Arrays = Strings? oder bin ich da falsch informiert?




sheel hat gesagt.:


> strcat kann mit %8 nichts anfangen.
> Was soll das überhaupt sein?


Habe föllig überlesen das es in strcat steht sry mein fehler



sheel hat gesagt.:


> Das scanf darunter..."Squid.log"
> Hmm...vllt. mein Fehler.
> Mit Dateiname meinte ich oben eigentlich den Namen der FILE-Variable.


Achso also fileInput


```
FILE *fileInput;
  fileInput = fopen("squid123.log", "r");
```





sheel hat gesagt.:


> Zumindest das sprintf leuchtet ein.


dann bin ich erleichtert


----------



## sheel (29. November 2011)

char-Array = String: Ja.
String bezeichnet generell Zeichenketten...
und da sie letztendlich nur eine Menge aus Einzelbuchstaben/zeichen sind,
ist es eben ein char-Array.

fopen: Genau so mein ich das.
Und fclose nicht vergessen.


----------



## Paper (29. November 2011)

sheel hat gesagt.:


> Vor dem ersten strcpy muss format einen Inhalt haben.


Was für ein Inhalt? und wie?




deepthroat hat gesagt.:


> Das war nicht die Frage.
> 
> Was erwartet die Funktion (da mußt du mal in die Referenz kucken!)?
> 
> Was hast du übergeben?


Der braucht doch eine Variable die er beschreiben kann oder?.. habe ich ja gemacht =) *format*


deepthroat hat gesagt.:


> Warum kann das also nicht funktionieren?


Weil ich das vielleicht falsch verstanden habe? =/


----------



## deepthroat (29. November 2011)

Paper hat gesagt.:


> Der braucht doch eine Variable die er beschreiben kann oder?.. habe ich ja gemacht =) *format*


Nein, hast du nicht.

Und ich glaube du hast es immer noch nicht verstanden.

Es geht um den Typ des Parameters und der Variablen. Nochmal: Was wird (für ein Typ) erwartet? Und was (für ein _Ding_) hast du übergeben?


----------



## Paper (29. November 2011)

deepthroat hat gesagt.:


> Nein, hast du nicht.
> 
> Und ich glaube du hast es immer noch nicht verstanden.
> 
> Es geht um den Typ des Parameters und der Variablen. Nochmal: Was wird (für ein Typ) erwartet? Und was (für ein _Ding_) hast du übergeben?



Ohh mist  oh man-.- ich bin doof in Programmierung  
okay gut ich bin zwar in die richtung tendiert aber war nicht 100% sicher
also einen char/string dahin setzen?=)


----------



## deepthroat (29. November 2011)

Paper hat gesagt.:


> Ohh mist  oh man-.- ich bin doof in Programmierung
> okay gut ich bin zwar in die richtung tendiert aber war nicht 100% sicher
> also einen char/string dahin setzen?=)


Ist das ein Ratespiel? Was denn nun? Ein char oder String? Und warum dahinter?


----------



## Paper (29. November 2011)

deepthroat hat gesagt.:


> Ist das ein Ratespiel? Was denn nun? Ein char oder String? Und warum dahinter?


 Sry ich meinte an die Stelle wo mein Fehler war.

Ein string muss dahin.


----------



## Paper (1. Dezember 2011)

Ich bin fast am Ziel =) was ich nur nicht verstehe warum das Programm abstürzt
Ich weiß ich bin hier voll die belastungsprobe für euch 



```
//Deklaration der Variablen
char prefix[1024]="";
char format[50]="";
char datum;
char x;

//String kopieren 1 an 2
strcpy (prefix, format);
//string 1 an String 2 anhängen
strcat (format, "%8d.log");




  //Zwischenspeicher fürs Einlesen
  char puffer[256];
  int line= sizeof(puffer);
 
  //Trennzeichen
  char del[]="\n";
 
  //Zählvariabeln
  int i =0;
 
  //Festlegen des Pfades für die Input-Datei
  FILE *fileOutput;
  fileOutput = fopen("SquidNEU.log", "w");
  sprintf(x, "%s%8dNeu.log", prefix, datum);
 
 
  //Überprüfung, ob Datei vorhanden ist
  if(NULL == fileOutput) {
    fprintf(stderr, "Fehler beim Oeffnen ...\n");
    return EXIT_FAILURE;
  }
 
  //Festlegen des Pfades für die Output-Datei
  FILE *fileInput;
  //sscanf(fileInput = fopen("squid123.log", "r"), format, &datum);
  fileInput = fopen("squid123.log", "r");
 


  //Überprüfung, ob Datei vorhanden ist
  if(NULL == fileInput) {
    fprintf(stderr, "Fehler beim Oeffnen ...\n");
    return EXIT_FAILURE;
  }
 
  //solange Zeilen vorhanden sind wird eingelesen
  while(fgets (puffer, line, fileInput))
    {
/// neue Zeilen
      int len;
      int uxtime;
      if (sscanf(puffer, "%d.%*d%n", &uxtime, &len) >= 1) {
        fprintf(fileOutput, "%s %s", Unix2Date(uxtime, 1), puffer + len);
      }
////
    }
 
  
 
  //Schließen der Dateien
  fclose(fileInput);
  fclose(fileOutput);
}
```




Und wenn ich bei diesen Teil hier

```
//Festlegen des Pfades für die Output-Datei
  FILE *fileInput;
  sscanf(fileInput = fopen("squid123.log", "r"), format, &datum);
  fileInput = fopen("squid123.log", "r");
```


Dann stürzt das Programm nicht ab, aber ich bekomme keine Ausgabe finde aber den Fehler nicht :/
Gruß Paper


----------



## deepthroat (1. Dezember 2011)

Hi.





Paper hat gesagt.:


> ```
> //String kopieren 1 an 2
> strcpy (prefix, format);
> ```


format ist ein leerer String  (Länge = 0).
prefix ist ein leerer String (Länge = 0).

Du kopierst also einen leeren String in einen leeren String. Wozu?


Paper hat gesagt.:


> ```
> //string 1 an String 2 anhängen
> strcat (format, "%8d.log");
> ```


Du hängst an einen leeren String etwas an. Du könntest genauso gut gleich strcpy nehmen. Oder einfach den String gleich entsprechend initialisieren:

```
char format[50]="%8d.log";
```
So, und nun? Das andere ist doch Code den du schon vor Tagen gehabt hast. Ich dachte du wolltest den Namen vom Benutzer einlesen? Der Teil ist irgendwie verloren gegangen... ? 

\edit: Evtl. solltest du genau das erstmal versuchen: Lies vom Benutzer einen Namen für die Datei ein.

Gruß


----------



## Paper (1. Dezember 2011)

Ich dreh durch...egal wie ich das mache mit strcpy oder strcat es will einfach nicht funktionieren.
strcpy (source-string, destination-string);

strcat (destination-string, source-string); 

oder nicht?


Da hab ich mir aber was anderes überlegt...stellen wir uns mal vor der Accesslog heißt garnicht Squid123 (was sowieso der Fall sein wird)  
gibt es eine möglichkeit das er den Accesslog aus dem bestimmten Ordner holt? auch wenn wir nicht wissen wie der vorher heißt?

Irgendwie das er vielleicht nach .log sucht und diesen dann nimmt?


----------



## sheel (1. Dezember 2011)

strcpy/strcat: strcpy ist falsch.
Die destination ist immer der erste Parameter.

Zum log-suchen: Haben wir nicht schonmal auf der ersten Seite über das geredet?
FindFirstFile und FindNextFile.


----------



## Paper (1. Dezember 2011)

sheel hat gesagt.:


> Zum log-suchen: Haben wir nicht schonmal auf der ersten Seite über das geredet?
> FindFirstFile und FindNextFile.



Jo stimmt =) ich schau mal =)


Mal ne frage:
Hat jemand i.welche guten seiten wo erklärungen/tutorials etc. sind?
Eure Empfehlungen =)


----------



## sheel (1. Dezember 2011)

Ja, MSDN


----------



## deepthroat (1. Dezember 2011)

Ja, hier! ;-]

Es gab schon unzählige Themen wie man Dateien aus einem Ordner liest. Die richtigen Stichworte hast du doch schon...


----------



## Paper (2. Dezember 2011)

Hmm ich tu mich richtig schwer damit-.-'' Ich versteh das nicht so ganz wie das funktioniert mit dem FindFirst =/

ich hab mir das einfach aus i.welchen sites zusammengeschnitten =/
Versteh's aber nicht  kann mir jemand FirstFile erklären?=/


```
bool DateiFinden()
{
   handle            hFile;
   WIN32 FIND_DATA   FindeData;
   std::vector fileListe;

   char chFolderpfad[_MAX_PATH];
   CString strExtension   = _T("*.log");

   
   
   
   

   hFile = FindFirstFile(chFolderpfad, &FindeData);

   if (hFile == INVALID_HANDLE_VALUE) {

      cout<<"Fehler";
      return false;
   }

   CString filepath;

   do
   {

      filepath.Format(_T("%s%s"), _T(""), FindeData.cFileName);
      fileListe(filepfad);

   } while(FindNextFile(hFile, &FindeData));

   return true;
}
```


Die SChleifen an sich versteh ich aber ich fand z.B keine Syntax für FindFirst da sind auch so einige sachen drin die ich so nicht verstehe


----------



## cwriter (3. Dezember 2011)

Was verstehst du nicht? Rede doch mal bitte Klartext!
http://www.c-programmieren.com/C-Lernen.html#Verzeichnis auslesen
Das listet alle Dateien und Ordner in C:\ auf.
Beachte, dass bei diesem Beispiel der ANSI Zeichensatz verwendet wird. Entweder du hängst bei FindFirstFile ein 'A' an, also FindFirstFileA() oder du formatierst alles um.

Gruss
cwriter


----------

