Hilfe beim C Programm :)

Die Verwendung von printf in dieser Form ist sowieso gefährlich (was wenn ein % im String ist?).
Achso ich hatte das so gelassen weil man in einem Timestamp ja eh kein % oder sonstiges findet. :)



Ich habe das jetzt mal so gemacht. Ich habe keine Ahnung was da genau rein muss, ich habe es so versucht aber das war wohl ein Fehler. :D
C:
const char* Unix2Date(int unixzeit,int modusTime) 
{
  static char str1[50];
 
 //Variabeln für die einzelnen Datumsteile 
  int ijahr=0,imonat=0,itag=0,istd=0,imin=0,isek=0;
  char timezone[30];
  
  
  char stringVar[20];
  int sommerZeit=0;
  
  //Endwert der UnixZeit 19.01.2038 um 4:14:07
  int unixMax = 2147483647;
  
  //Überprüfung,ob die eingegebene Unixzeit gültig ist
  if (unixzeit>>unixMax)
  {
                          
     errorSend(); 
   
  }
  
  //time_t ist ein Zeitstempel ... in Sek ab 1970
  //wie UnixZeit
  time_t unixStamp = unixzeit;
  
  //Struktur für time_t
  struct tm * unixConvert;
  
  //String zum Speichern des Datums
  char cbuffer[80];
  
  //Struktur bekommt den Zeitstempel
   
  if(modusTime==2)
  unixConvert = localtime(&unixStamp);
  else if (modusTime==1)
  unixConvert = gmtime(&unixStamp);
  
  //Speichern der einzelnen Datumsteile in Variabeln
  strftime( stringVar, 20, "%d", unixConvert ); //Tag
  itag = atoi(stringVar);
  strftime( stringVar, 20, "%m", unixConvert ); //Monat
  imonat = atoi(stringVar);
  strftime( stringVar, 20, "%Y", unixConvert ); //Jahr
  ijahr = atoi(stringVar);
  strftime( stringVar, 20, "%H", unixConvert ); //Stunde
  istd = atoi(stringVar);
  strftime( stringVar, 20, "%M", unixConvert ); //Minute
  imin = atoi(stringVar);
  strftime( stringVar, 20, "%S", unixConvert ); //Sekunde
  isek = atoi(stringVar);
  
  
  //Zeitzone
  strftime( timezone, 30, "%z", unixConvert );
  
 
//Ausgabestring  
char str1[50]; 

//Zwischenspeicher
char buffer[20];
 
 
  //Umwandlung und Zusammenfassung in einen Return-String
 strcpy (str1,itoa(itag,buffer,10));
 strcat (str1,".");
 strcat (str1,itoa(imonat,buffer,10));
 strcat (str1,".");
 strcat (str1,itoa(ijahr,buffer,10));
 strcat (str1," um ");
 strcat (str1,itoa((istd),buffer,10));
 strcat (str1,":");
 strcat (str1,itoa(imin,buffer,10));
 strcat (str1,":");
 strcat (str1,itoa(isek,buffer,10));
 if (modusTime==2)
 {
 strcat (str1,"  ");
 strcat (str1,timezone);
}
else
{
 strcat (str1,"  ");
 strcat (str1,"UTC/GMT");    
}

  puts(str1);
  return str1;
}

Den Code den ich schon hatte, für diesen Teil

C:
int Unix2Date(int unixzeit,int modusTime)
....
....
....
return str1;
 
Achso ich hatte das so gelassen weil man in einem Timestamp ja eh kein % oder sonstiges findet. :)
Woher willst du das wissen? Timezone steht z.B. unter Windows in der Registry und da kann man eintragen was man will...
Ich habe das jetzt mal so gemacht. Ich habe keine Ahnung was da genau rein muss, ich habe es so versucht aber das war wohl ein Fehler. :D
Warum? Fehlermeldungen? Warnungen? Absturz?
 
Woher willst du das wissen? Timezone steht z.B. unter Windows in der Registry und da kann man eintragen was man will...

Ja gut stimmt ich bin nur von dem Linux Timestamp ausgegangen :) weil das Programm nur dafür gebraucht wird.


Warum? Fehlermeldungen? Warnungen? Absturz?
Jaaa Fehlermeldungen und zwar folgende

genau so werden die mir angezeigt unten bei Dev C++

193 conflicting types for 'Unix2Date'
54 previous implicit declaration of 'Unix2Date' was here
In function `Unix2Date':
252 redeclaration of 'str1' with no linkage
194 previous declaration of 'str1' was here
281 [Warning] function returns address of local variable
 
Jaaa Fehlermeldungen und zwar folgende

genau so werden die mir angezeigt unten bei Dev C++

193 conflicting types for 'Unix2Date'
54 previous implicit declaration of 'Unix2Date' was here
In function `Unix2Date':
Du mußt die Funktionen alle deklarieren, bevor du sie benutzt.
252 redeclaration of 'str1' with no linkage
194 previous declaration of 'str1' was here
Du darfst die Variable str1 nicht doppelt definieren. Ich dachte das wäre klar...
 
Du mußt die Funktionen alle deklarieren, bevor du sie benutzt.
Hmm okay =/ jetzt nurnoch schauen wie ich das anstelle


Du darfst die Variable str1 nicht doppelt definieren. Ich dachte das wäre klar...
aach ich Holzkopf-.- jaaa sry :)

Mal eine andere frage :) den Pfad zur Datei die eingelesen wird habe ich momentan so angegeben

C:
//Festlegen des Pfades für die Input-Datei
  FILE *fileInput;
	   fileInput = fopen( "squidN123.log", "r");

das geht aber nur wenn die Datei sich im gleichen Ordner befindet wie das Programm.
Geht das irgendwie das die Software drauf zugreift auch wenn die 2 Dateien in unterschiedlichen Verzeichnissen liegen? :)
 
Zuletzt bearbeitet von einem Moderator:
Paper hat gesagt.:
Mal eine andere frage :) den Pfad zur Datei die eingelesen wird habe ich momentan so angegeben

C:
//Festlegen des Pfades für die Input-Datei
  FILE *fileInput;
	   fileInput = fopen( "squidN123.log", "r");

das geht aber nur wenn die Datei sich im gleichen Ordner befindet wie das Programm.
Das ist schonmal nicht richtig. Die Datei muss sich im aktuellen Verzeichnis (CWD) befinden, wo das Programm liegt ist unwichtig.
Paper hat gesagt.:
Geht das irgendwie das die Software drauf zugreift auch wenn die 2 Dateien in unterschiedlichen Verzeichnissen liegen? :)
Ja, das geht. Dann mußt du den Pfad eben angeben (z.B. als Kommandozeilenoptionen?)

Gruß
 
Jetzt muss ichs nurnoch schaffen das im Neu angelegten Squid alles drin steht was im Originalen Squid auch steht. Quasi so

Originaler Squid
Code:
1310139853.232      3 xxx.xxx.xxx.xxx TCP_MISS/304 205 GET http:www.bla-keks.gif- DIRECT/xxx.xxx.xxx.xxx - 
1310139853.235      3 xxx.xxx.xxx.xxx TCP_MISS/304 205 GET http:www.bla-keks.gif- DIRECT/xxx.xxx.xxx.xxx - 
1310139853.237       3 xxx.xxx.xxx.xxx TCP_MISS/304 205 GET http:www.bla-keks.gif- DIRECT/xxx.xxx.xxx.xxx -

der neue Squid soll so aussehen.

Code:
8.7.2011 um 17:44:13   3 xxx.xxx.xxx.xxx TCP_MISS/304 205 GET http:www.bla-keks.gif- DIRECT/xxx.xxx.xxx.xxx - 
8.7.2011 um 17:44:13   3 xxx.xxx.xxx.xxx TCP_MISS/304 205 GET http:www.bla-keks.gif- DIRECT/xxx.xxx.xxx.xxx -  
8.7.2011 um 17:44:13    3 xxx.xxx.xxx.xxx TCP_MISS/304 205 GET http:www.bla-keks.gif- DIRECT/xxx.xxx.xxx.xxx -


Weil mein momentaner Squid sieht so aus.
Code:
Unix: 1310139853 --> Datum: 8.7.2011 um 17:44:13  Mitteleuropäische Sommerzeit  
Unix: 1310139853 --> Datum: 8.7.2011 um 17:44:13  Mitteleuropäische Sommerzeit 
Unix: 1310139853 --> Datum: 8.7.2011 um 17:44:13  Mitteleuropäische Sommerzeit

Es ist halt immernoch der Code wie ich den gepostet hab :) Bei dem Teil habe ich noch nichts verändert. Ich komme da nur nicht zurecht, ich hatte mit getline oder sowas gerechnet aber fehlanzeige :D
 
Bsp:
C:
while (fgets(line, ...) != NULL) {
  char* rest;
  if ((rest = strtok(line, " \t\n")) != NULL) {
    fprintf(out, "%s %s", Unix2Date(line, mode), rest);
  }
}
Gruß
 
Erstmal die Variablen deklarieren und das kann in die Funktion gepackt werden?
Oder muss das an einen bestimmten Ort?
Aber was an stelle des ... hin muss versteh ich irgendwie nicht =/


Diese Meldungen gibt er mir aus...

In function `logConvert':
424 [Warning] passing arg 1 of `fgets' makes pointer from integer without a cast
424 [Warning] passing arg 2 of `fgets' makes integer from pointer without a cast
424 too few arguments to function `fgets'
426 [Warning] passing arg 1 of `strtok' makes pointer from integer without a cast
427 `out' undeclared (first use in this function)
(Each undeclared identifier is reported only once
for each function it appears in.)
427 `mode' undeclared (first use in this function)



Ich versteh das zwar ich kann es nur nicht umsetzen =/
 
Zuletzt bearbeitet von einem Moderator:
Etwas einfacher:

C:
while (fgets ... ) {
  int len;
  int uxtime;

  if (sscanf(puffer, "%d.%*d%n", &uxtime, &len) >= 1) {
    fprintf(... , "%s %s", Unix2Date(uxtime, mode), puffer + len);
  }
}
 
Zurück