C schleife mit fscanf() ändert das verhalten

SaimenD

Cadet 1st Year
Registriert
Nov. 2013
Beiträge
14
OK ich hab ewig rumprobiert und finde das problem nicht

ich bin grad am schreiben einer datei die eine .txt datei für mich einließt und das letzte datum findet und speicher.
das letzte datum steht aber nicht in der letzten zeile deswegen bin ich einfach das ganze dokument durchgegangen und hab nach zeilen mit der struktur MMM TT JJJJ hh:mm:ss (zb JUL 30 2008 23:45:15) gesucht und diese abgespeichert.
funktiniert auch super, ABER

das letzte datum (AUG 08 2008) wird nicht als AUG 8 2008 23:30:20 sondern als AUG 0 8 2008:30:20 eingelesen.

Hier mal der Quelltext den ich geschrieben hab:

------------------------------------------------------------------------------------------------------------------------------------------------------------
Code:
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "float.h"

int tag=0, jahr=0, h=0, m=0, s=0, null=0;
int temp_tag=0, vergl_tag=0, temp_jahr=0, temp_h=0, temp_m=0, temp_s=0;
int ltag=0, ljahr=0, lh=0, lm=0, ls=0;
char temp_monat[3], monat[3], lmonat[3], zeile[150];
FILE *eingabe, *ausgabe;

int TageImMonat(char*);

int main(void) {

	eingabe = fopen("K:\\camerobot\\Temp.txt", "r");		//errors.log öffnen
	ausgabe = fopen("K:\\camerobot\\errorday.txt", "w");	//Ausgabedatei öffnen

	if (eingabe==NULL)
			{
				printf("Programm konnte nicht eingelesen werden");	//Zeigt fehler beim einlesen der datei
				fprintf(ausgabe,"Programm konnte nicht eingelesen werden");
				return 0;
			}
	do
	{
		fgets(zeile,150,eingabe);
		sscanf(zeile,"%s %i %i %i:%i:%i",temp_monat, &temp_tag, &temp_jahr, &temp_h, &temp_m, &temp_s);
                                vergl_tag=TageImMonat(temp_monat);
		if(vergl_tag!=0)
		{
			strcpy(monat,temp_monat);
			tag=temp_tag;
			jahr=temp_jahr;
			h=temp_h;
			m=temp_m;
			s=temp_s;
			printf("%s %i %i %i:%i:%i\n",monat,tag,jahr,h,m,s);
			fprintf(ausgabe,"%s %i %i %i:%i:%i\n",monat,tag,jahr,h,m,s);
		}
	}
	while(!feof(eingabe));

	strcpy(lmonat,monat);
	ltag=tag;
	ljahr=jahr;
	lh=h;
	lm=m;
	ls=s;
	printf("Das letzte Datum=%s %i %i %i:%i:%i",lmonat,ltag,ljahr,lh,lm,ls);

	fclose(eingabe);
	fclose(ausgabe);
	return 1;
}

int TageImMonat(char* x)
{
   if (!strcmp(x,"FEB")) return 29;
   else if(!strcmp(x,"APR") || !strcmp(x,"JUN") || !strcmp(x,"SEP") || !strcmp(x,"NOV")) return 30;
   else if(!strcmp(x,"JAN") || !strcmp(x,"MAE") || !strcmp(x,"MAY") || !strcmp(x,"JUL") || !strcmp(x,"AUG") || !strcmp(x,"OKT") || !strcmp(x,"DEZ")) return 31;
   else return 0;
};

Es is warscheinlich nicht die beste lösung für das problem aber eigentlich sollte es funktionieren

Das problem entsteht bei diesen zeilen der .txt datei:
HTML:
AUG 07 2008 23:53:56]: CPU temperature: 48°C 
AUG 08 2008 00:48:41]: Settling arm power... 
AUG 08 2008 00:48:42]: Arm power settled. 
AUG 08 2008 00:50:34]: Arm power shutdown...

für diesen abschnitt bekomme ich die ausgabe:
HTML:
AUG 7 2008 23:53:56
AUG 0 8 2008:53:56
AUG 0 8 2008:53:56
AUG 0 8 2008:53:56
AUG 0 8 2008:53:56
Das letzte Datum=AUG 0 8 2008:53:56

Das problem ist das fscanf() für temp_tag die "0" statt der "8" einließt aber ich versteh nicht warum
Das programm funktioniert für jeden anderen Tag außer für den 8.AUG.
Vielen dank für jede Hilfe und Bemühungen

SaimenD
 
Das liegt daran, dass Zahlen mit führender 0 als Oktalzahlen interpretiert werden, wo es nur die Ziffern 0 - 7 gibt.
 
Benutze für das Einlesen der Zahlen %d statt %i. %i interpretiert Zahlen, die mit einer 0 anfangen, als Oktalzahlen - und 8 ist keine gültige Ziffer im Oktalsystem. Siehe auch: http://www.cplusplus.com/reference/cstdio/scanf/

Edit: Verdammt, zu langsam :p
 
Ach klar da hätt ich auch selber drauf kommen können das es an den Oktalzahlen liegt wenns bei 8 abspakt :freak:
und ich such mir gestern nen ast ab ^^

gut vielen dank für die schnelle Hilfe, der teil des Programms funktioniert jetzt
jetzt kann ich wenigstens weiterprogramieren
 
Zuletzt bearbeitet:
Zurück
Oben