#include <math.h>
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct time{
int minuten;
double sekunden;
};
int main(void)
{
FILE *eingabe; //Pointer an den der Dateiname zugewiesen wird
FILE *ausgabe ; //Pointer für Textausgabe
FILE *error;
double trennzahl;
double fuel1,fuel2;
struct time drucktime1;
struct time drucktime2;
char *zeiger, i; //Zeiger zum Stringauslesen
char name_eingabe[10]; //Dateiname der Eingegeben wird
char zeile[100];
int zaehler=0;
int rpm1,rpm2,temp1,temp2,speed1,speed2;
int richtig=0; //Zähler für Maschine 1 zählt die Richtigkeit der einzelnen Datensätze und überprüft
int richtig1=0; //Zähler für Maschine 2 zählt die Richtigkeit der einzelnen Datensätze und überprüft
int wurdegedruckt=0; //Zähler um den Überschriftendruck nach 20 Zeilen zu wiederholen;
//Aufruf aller Funktionen!
int inumber(char temparray[]); // Inumber überprüfung
int pnumber(char temparray[]); // Pnumber überprüfung
double rpm (double trennzahl); // RPM beider maschinen
double speedm2 (double trennzahl); //speed maschine 2
double fuelm2 (double trennzahl); // fuel maschine 2
double tempm2 (double trennzahl); // temp maschine 2
time timem1 (double trennzahl); // time maschine 1
time timem2 (double trennzahl); // time maschine 2
void druck1(time drucktime1,int rpm1, int speed1, double fuel1, int temp1); //Druck Funktion Maschine 1
void druck2(time drucktime2, int rpm2 ,int speed2,double fuel2,int temp2); //Druck Funktion Maschine 2
void druckstern(); // Fehler Print
printf ("Uebungsaufgabe 3: Datenfilter by Jan Knobloch SS 2005");
printf ("\n\n");
/* Abfrage des Dateinamens*/
printf ("Geben den Dateinamen der zu oeffnenden Datei ein:");
gets (name_eingabe);
/*Öffnen der Dateien*/
eingabe=fopen(name_eingabe, "r");
ausgabe=fopen("errors.txt", "w");
error=fopen("errors.txt", "w");
printf("%s",eingabe);
if (eingabe==NULL)
{
printf ("Datei ist leer/und oder nicht vorhanden!");
getch();
return 0;
}
printf ("Datei wurde erfolgreich eingelesen vielen Dank!\n\n");
getch();
//----------------------------------------------DRUCKEN DER KOPFZEILE DER AUSGABE----------------
printf (" Zeit Umdrehungen Geschwindigkeit Verbrauch Temperatur\n");
printf (" [m:s] [1/s] [km/h] [l/100km] [Grad C]\n");
//-----------------------------------------------------------------------------------------------
char trennzeichen;
while (!feof(eingabe))
{
fgets (zeile,100,eingabe);
for(i=0; i<strlen(zeile); i++) // Solange String nicht zuende ist soll zähler erhöht werden
{
if (zeile[i]=='$') // wenn trennzeichen Dollar gefunden wird wird trennzeichen auf Dollar gesetzt
{
trennzeichen='$';
break;
}
if (zeile[i]==',') // wenn trennzeichen Komma gefunden wird wird trennzeichen auf Komma gesetzt
{
trennzeichen=',';
break;
}
}
char temparray[100]; //Temparray zum ablegen von Teilstrings
int tempzaehler=0; // Zähler auf null
int data=0; // Stelle des Datensatzes auf null
for(i=0; i<strlen(zeile); i++) // Solange String nicht zuende ist soll zähler erhöht werden
{
if (zeile[i]!=trennzeichen && zeile[i]!='\n') //Wenn zeichen im String nicht Trennzeichen und nicht Absatz
{
temparray[tempzaehler]=zeile[i]; // Dann wird string in Teilstring kopiert
tempzaehler++;
}
else // Ansonsten!
{
temparray[tempzaehler]='\0'; //Wird ein Stringende eingebaut
tempzaehler=0; //Tempzähler auf 0 gesetzt
data++; // Erhöhung des Datensatzes zum fangen in der if Schleife!
if (trennzeichen==',') // Aufteilen nach Maschine 1 und 2 durch Trennzeichen erkennung
{
if (data==1) // Datensatz 1 von Trennzeichen Komma wird bearbeitet
{
//TIME
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig=(richtig+pnumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
drucktime1=timem1(trennzahl); // Umrechnung der Zahl mittels ihrer Funktion
}
if (data==2) // Datensatz 2 von Trennzeichen Komma wird bearbeitet
{
//RPM
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
rpm1=(int)(rpm(trennzahl)); // Umrechnung mittels ihrer Funktion
richtig=(richtig+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
}
if (data==3) // Datensatz 3 von Trennzeichen Komma wird bearbeitet
{
//SPEED
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig=(richtig+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
speed1=((int)(trennzahl)); // Umrechnung mittels ihrer Funktion
}
if (data==4) // Datensatz 4 von Trennzeichen Komma wird bearbeitet
{
//FUEL
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig=(richtig+pnumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
fuel1=(trennzahl); // Umrechnung mittels ihrer Funktion
}
if (data==5) // Datensatz 5 von Trennzeichen Komma wird bearbeitet
{
//TEMP
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig=(richtig+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
temp1=((int)(trennzahl)); // Umrechnung mittels ihrer Funktion
if (richtig == 5) // Wenn alle Zahlen richtig überprüft wurden
{
druck1(drucktime1,rpm1,speed1,fuel1,temp1); // Ausgabe der Zeile
wurdegedruckt++; // Erhöhung des Zählers fuer REPrint der Kopfzeile
richtig=0; // Rückzsetzen von richtig
richtig1=0; //Rücksetzen von richtig2
zaehler++; // erhöhung des Zählers zur richtigen Zeilenausgabe
}
else
{
druckstern(); // Ausgabe des Fehlerdrucks
fprintf (error,"%s\n\n",zeile); //Schreiben in die Fehlerdatei
wurdegedruckt++; // Erhöhung des Zählers fuer REPrint der Kopfzeile
zaehler++; // erhöhung des Zählers zur richtigen Zeilenausgabe
richtig=0; //Rücksetzen von richtig
richtig1=0; //Rücksetzen von richtig2
}
}
}
else // Wenn Trennzeichen DOLLAR IST
{
if (data==1) // Datensatz 1 von Trennzeichen Dollar wird bearbeitet
{
//TIME
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig1=(richtig1+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
drucktime2=timem2(trennzahl); // Umrechnung mittels ihrer Funktion
}
if (data==2) // Datensatz 2 von Trennzeichen Dollar wird bearbeitet
{
//NAME
}
if (data==3) // Datensatz 3 von Trennzeichen Dollar wird bearbeitet
{
//TEMP
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig1=(richtig1+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
temp2=(int)(tempm2(trennzahl)); // Umrechnung mittels ihrer Funktion
}
if (data==4) // Datensatz 4 von Trennzeichen Dollar wird bearbeitet
{
//SPEED
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig1=(richtig1+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
speed2=(int)(speedm2(trennzahl)); // Umrechnung mittels ihrer Funktion
}
if (data==5) // Datensatz 5 von Trennzeichen Dollar wird bearbeitet
{
//FUEL
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig1=(richtig1+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
fuel2=fuelm2(trennzahl); // Umrechnung mittels ihrer Funktion
}
if (data==6) // Datensatz 6 von Trennzeichen Dollar wird bearbeitet
{
//RPM
trennzahl=atof(temparray); //umwandlung des Strings in eine Double Zahl
richtig1=(richtig1+inumber(temparray)); // Zähler zur endüberprüfung ob Zeile korrekt eingelesen wurde wird erhöht
rpm2=(int)(rpm(trennzahl)); // Umrechnung mittels ihrer Funktion
zaehler++;
if(richtig1 != 5)
{
druckstern(); //Ausgabe der Fehlerzeile falls falsch
fprintf (error,"%s\n\n",zeile); // Drucken in Fehlerdatei
richtig1=0; //Rücksetzung von Richtig
wurdegedruckt++; // Erhöhung von wurdegedruckt
zaehler++; // Erhöhung des Zählers
}
if (richtig1 == 5 && zaehler!=8) // Damit letzte zeile nicht ausgelassen wird
{
druck2(drucktime2,rpm2,speed2,fuel2,temp2); // Drucken der letzten Zeile
wurdegedruckt++; // Erhöhung von wurdegedruckt
richtig1=0; // Rücksetzung von Richtig
}
}
}
}
if (wurdegedruckt==20){
//----------------------------------------------DRUCKEN DER KOPFZEILE DER AUSGABE----------------
printf ("\n\n");
printf (" Zeit Umdrehungen Geschwindigkeit Verbrauch Temperatur\n");
printf (" [m:s] [1/S] [km/h] [l/100] [Grad C]\n");
//-----------------------------------------------------------------------------------------------
wurdegedruckt=0;
}
}
}
getch();
}
//-----------------------------------------------------------Überprüfung der I NUMMER---------------------
int inumber(char temparray[])
{
for(int i=0; i<strlen(temparray); i++) // Durchlaufen des Teilstrings
{
if (!isdigit(temparray[i])) //Wenn es keine zahl ist 0 Rückgeben
return 0;
}
return 1; // ansonsten 1
}
//-----------------------------------------------------------Überprüfung der P NUMMER---------------------
int pnumber(char temparray[])
{
char *trennzeichen=".";
char *pointer;
pointer=strtok(temparray,trennzeichen);
if (!atoi(pointer))
{
return 0;
}
pointer=strtok(NULL,"."); //NULL IST EIN POINTER DIE FUNKTION VERLANGT 2 POINTER UND BEKOMMT EINEN NEUEN ( CONST POINTER ODER STATIC VARIABLE IN STRING.H)
if (!atoi(pointer))
{
return 0;
}
return 1;
}
//--------------------------------------------------TIME MASCHINE1---------------------------
time timem1 (double trennzahl)
{
struct time drucktime;
double nachkomma;
int vorkomma=0;
drucktime.minuten=(int)trennzahl; // Abschneiden des nachkomma teils
drucktime.sekunden=(trennzahl-drucktime.minuten); // ausrechnen des nachkomma teils
drucktime.sekunden=(round(((drucktime.sekunden )*60))); // umrechnung des nachkomma teils da 100 einheiten
return drucktime;
}
//----------------------------------------------------TIME MASCHINE2------------------------
time timem2 (double trennzahl)
{
struct time drucktime;
if (trennzahl >= 60) //Wenn Trennzahl über 60 Sekunden
{
drucktime.minuten=(int)(trennzahl/60); //Abschneiden des nachkomma teils und Umrechnen in Minuten
drucktime.sekunden=round(((trennzahl/60)-drucktime.minuten)*100); //Zahl - vorkomma = nachkomma *100 wegen 0.xxx
}
else{
drucktime.minuten=00;
drucktime.sekunden=round(trennzahl);
}
return drucktime;
}
//-----------------------------------------------------RPM UMRECHNUNG 1 und 2---------------------------
double rpm (double trennzahl)
{
trennzahl=(trennzahl/60); // RPM / 60 = RP/S
return trennzahl;
}
//------------------------------------------------------------------------------------------------------
//-----------------------------------------------------SPEED UMRECHNUNG2----------------------------------
double speedm2 (double trennzahl)
{
trennzahl=(trennzahl *3.6); // Umrechnung in KM/H pro STD
return trennzahl;
}
//------------------------------------------------------------------------------------------------------
//-----------------------------------------------------FUEL UMRECHNUNG2----------------------------------//!!!
double fuelm2 (double trennzahl)
{
trennzahl=((trennzahl*60)/1000)/100; // * 60 = ML / 1000 = LITER /100 = LITER/KM
return trennzahl;
}
//------------------------------------------------------------------------------------------------------
//-----------------------------------------------------TEMP UMRECHNUNG2----------------------------------
double tempm2 (double trennzahl)
{
trennzahl=(trennzahl-273); // Umrechnen in Grad Celsius
return trennzahl;
}
//------------------------------------------------------------------------------------------------------
//---------------------------------------------------DRUCK M1-------------------------------------------
void druck1(time drucktime1,int rpm1, int speed1, double fuel1, int temp1)
{
printf (" %.2d:%0.0lf %13d %16d %11.2lf %13d\n",drucktime1.minuten,drucktime1.sekunden,rpm1,speed1,fuel1,temp1);
}
//------------------------------------------------------------------------------------------------------
//---------------------------------------------------DRUCK M2-------------------------------------------
void druck2(
time drucktime2, int rpm2 ,int speed2,double fuel2,int temp2)
{
printf (" %.2d:%0.0lf %13d %16d %11.2lf %13d\n",drucktime2.minuten,drucktime2.sekunden,rpm2,speed2,fuel2,temp2);
}
//------------------------------------------------------------------------------------------------------
//---------------------------------------------------FEHLERAUSGABE--------------------------------------
void druckstern()
{
printf (" ***********************Fehler in Zeile*************************\n");
}
//------------------------------------------------------------------------------------------------------