Zum Inhalt springen

Ansi C - datei einlesen - schreiben


Empfohlene Beiträge

Geschrieben

Hallo ihr.

ich brauche eure Hilfe. Nach langen hin und her bin ich ein wenig weiter mit meinen kleinen Tool gekommen.

Kleine Beschreibung worum es geht:

Eine CSV- Datei soll eingelesen werden. Dann in eine andere CSV-Datei geschrieben werden, allerdings nur "wichtige" Werte daraus.

Das klappt soweit, bis auf:

Die Werte die wieder hineingeschrieben sind, kommen nicht in den Spalten an, wo sie eigentlich hin sollen.

Zudem werden sie teilweise hintereinander weg geschrieben....

Vllt könnt ihr auf den ersten (oder 2.) Blick was auffälliges erkennen:


#include <stdio.h>


#include <string.h>


#define INPUTFILE "Air_Plus_Beispiel.csv"

#define OUTPUTFILE "test.csv"

#define DELIM ";"

#define ANZ_SPALTEN 


int main (void) {

	FILE * input_stream, *output_stream; //Dateizeiger, zeigt auf Informationen über eine geöffnete Datei (nach fopen()) 

	char line[BUFSIZ]; //Speicherbereich für eingelesene Zeile 

	//char line [BUFSIZ]; //Zeigerarray zum Speichern der Zeiger auf die einzelnen Tokens 

	int i;

	char * temptok; //Hilfszeiger für strtok() 

	char file;

	char tokens[45][BUFSIZ]; 

	char *akt_token; //neuer Zeiger, der auf das aktuelle Token zeigt



	printf("********** Datei-Auswahl **********\n\n");

    printf("1. Airplus\n");

    printf("2. Vodafone\n");

    printf("3. Beenden\n\n");


    printf("Bitte waehlen Sie nun, welche Datei sie verarbeiten wollen.\n\n");

    printf("Ihre Eingabe: ");

    scanf("%i",&file);

    printf("\n\n\n");



    switch(file)

    {

    case 1:  printf("********** Airplus **********\n");



	input_stream  = fopen( INPUTFILE, "r"); // Eingabe oeffnen (lesen)

	if (input_stream == NULL) 

    {

		printf( "\nThe file '%s' was not opened\n", INPUTFILE );//fehlermeldung

		exit(2);

	};


	output_stream =  fopen( OUTPUTFILE, "a"); //Ausgabe oeffnen (anhängen)

	if (output_stream == NULL) 

    {

		printf( "\nThe file '%s' was not opened\n", OUTPUTFILE );//fehlermeldung

		exit(2);

	};


	while (!feof(input_stream)) //Solange kein End-Of-File in der Eingabe...

    { 

		fgets (line, BUFSIZ, input_stream); //liest eine Zeile von einer Datei ein 


		i = 0;

		temptok = line;

		for(i = 0; (akt_token = strtok(temptok, DELIM)) != NULL && i < 43; ++i) 

		{ 

           strcpy(tokens[i], akt_token); 

           temptok = NULL; 

        }  

  //strtok erwartet folgende Parameter:

//temptok ist die zu splittende Zeile beim 1. Aufruf und NULL bei nachfolgenden Aufrufen;

//der zweite Parameter sind die Grenzen der Tokens

// Konstante DELIM oben auf ";" definiert

//strtok gibt einen Zeiger auf den nächsten Token zurück oder NULL, wenn kein Token mehr da ist 

//(String zu Ende tokenisiert)


//weise tokens[i] die Adresse des nächstens Tokens zu; wenn die Adresse nicht NULL ist, mache Folgendes: ...



		//schreiben in datei

		fprintf (output_stream, "%s;",tokens[3]);

		fprintf (output_stream, "%s;",tokens[4]);

		fprintf (output_stream, "%s;",tokens[5]);

		fprintf (output_stream, "%s;",tokens[13]);

		fprintf (output_stream, "%s;",tokens[17]);

		fprintf (output_stream, "%s;",tokens[18]);

		fprintf (output_stream, "%s;",tokens[19]);

		fprintf (output_stream, "%s;",tokens[25]);

		fprintf (output_stream, "%s;",tokens[27]);

		fprintf (output_stream, "%s;",tokens[31]);

		fprintf (output_stream, "%s;",tokens[38]);

	};

	//schließen der beiden datein

	fclose (output_stream);

	fclose (input_stream);



	break;

   case 2:  printf("********** Vodafone **********\n");

              break;

   case 3:  printf("********** Programm wird beendet **********\n");

              break;

   default :  printf("********** Falsche Eingabe! **********\n");

              break;

}	

system("pause");


}

Geschrieben

Die Werte die wieder hineingeschrieben sind, kommen nicht in den Spalten an, wo sie eigentlich hin sollen.

Zudem werden sie teilweise hintereinander weg geschrieben....

Es wäre hilfreich, wenn du zeigen würdest, wie die Zeilen in der Ausgabedatei aussehen, und wie sie aussehen sollen.

Geschrieben

so sieht es im mom aus:

(%);Rechnungsnummer;Rechnungsdatum;Bruttobetrag;ReiseDatum;Netto(VW);MwSt(VW);Brutto(VW);Personal-ID;Kostenstelle;Projektnummer;;CC_Leistungscode;DOM-Kennzeichen;Fälligkeitstag;ReiseDatum;Netto(VW);MwSt(VW);Brutto(VW);Personal-ID;Kostenstelle;Projektnummer;;03 wert;datum;wert;datum;wert;0;wert,wert;0;05. Aug 04;datum;;03 wert;datum;wert;datum;wert;0;wert;wert;NO;datum;;03 wert;datum;wert;datum;wert;EUR;wert,wert;0;wert;datum;;03 06821829;datum;wert;datum;wert,wert;0;wert;datum;wert;0

;;03 wert;datum;wert;datum;wert;0;wert;datum;wert;0

;;03 wert;datum;wert;datum;wert;EUR;wert;wert;datum;0

;;03 wert;datum;wert;datum;wert;EUR;wert;wert;datum;0

;;03 wert;datum;wert;datum;wert;EUR;wert;wert;datum;0

;;03 wert;datum;wert;datum;wert;EUR;wert;wert;datum;0

;;

und so muss es ungefähr aussehen:

Rechnungsnummer;Rechnungsdatum;Bruttobetrag;ReiseDatum;Netto(VW);MwSt(VW);Brutto(VW);Personal-ID;Kostenstelle;Projektnummer;MwSt-Satz (%)

03 wert;datum;wert;datum;wert;0;wert;;wert;;wert

03 wert;datum;wert;datum;wert;0;wert;;wert;;wert

03 wert;datum;wert;datum;wert;0;wert;;wert;;wert

03 wert;datum;wert;datum;wert;0;wert;;wert;;wert

03 wert;datum;wert;datum;wert;0;wert;;wert;;wert

03 wert;datum;wert;datum;wert;0,wert;wert;;wert;;wert

03 wert;datum;wert;datum;wert,wert;wert;wert;;wert;;wert

ich hoffe ihr könnt etwas damit anfangen, da ich das was darin steht nicht im Board posten kann. Will ja keinen Ärger mit der Firma

Geschrieben


#include <stdio.h>


#include <string.h>


#define INPUTFILE "Air_Plus_Beispiel.csv"

#define OUTPUTFILE "test.csv"

#define DELIM ";"

#define ANZ_SPALTEN 45

#define LINE_LENGTH 1024


int main (void) {

	FILE * input_stream, *output_stream; //Dateizeiger, zeigt auf Informationen über eine geöffnete Datei (nach fopen()) 

	char line[LINE_LENGTH]; //Speicherbereich für eingelesene Zeile 

	//char line [LINE_LENGTH]; //Zeigerarray zum Speichern der Zeiger auf die einzelnen Tokens 

	int i;

	char * temptok; //Hilfszeiger für strtok() 

	char file;

	char tokens[ANZ_SPALTEN][LINE_LENGTH]; 

	char *akt_token; //neuer Zeiger, der auf das aktuelle Token zeigt



	printf("********** Datei-Auswahl **********\n\n");

    printf("1. Airplus\n");

    printf("2. Vodafone\n");

    printf("3. Beenden\n\n");


    printf("Bitte waehlen Sie nun, welche Datei sie verarbeiten wollen.\n\n");

    printf("Ihre Eingabe: ");

    scanf("%i",&file);

    printf("\n\n\n");



    switch(file)

    {

    case 1:  printf("********** Airplus **********\n");



	input_stream  = fopen( INPUTFILE, "r"); // Eingabe oeffnen (lesen)

	if (input_stream == NULL) 

    {

		printf( "\nThe file '%s' was not opened\n", INPUTFILE );//fehlermeldung

		exit(2);

	};


	output_stream =  fopen( OUTPUTFILE, "a"); //Ausgabe oeffnen (anhängen)

	if (output_stream == NULL) 

    {

		printf( "\nThe file '%s' was not opened\n", OUTPUTFILE );//fehlermeldung

		exit(2);

	};


	while (!feof(input_stream)) //Solange kein End-Of-File in der Eingabe...

    { 

		if( fgets (line, LINE_LENGTH, input_stream) ) //liest eine Zeile von einer Datei ein 

                {


		temptok = line;

		for(i = 0; (akt_token = strtok(temptok, DELIM)) != NULL && i < ANZ_SPALTEN; ++i) 

		{ 

           strcpy(tokens[i], akt_token); 

           temptok = NULL; 

        }  

  //strtok erwartet folgende Parameter:

//temptok ist die zu splittende Zeile beim 1. Aufruf und NULL bei nachfolgenden Aufrufen;

//der zweite Parameter sind die Grenzen der Tokens

// Konstante DELIM oben auf ";" definiert

//strtok gibt einen Zeiger auf den nächsten Token zurück oder NULL, wenn kein Token mehr da ist 

//(String zu Ende tokenisiert)


//weise tokens[i] die Adresse des nächstens Tokens zu; wenn die Adresse nicht NULL ist, mache Folgendes: ...



		//schreiben in datei

		fprintf (output_stream, "%s;",tokens[3]);

		fprintf (output_stream, "%s;",tokens[4]);

		fprintf (output_stream, "%s;",tokens[5]);

		fprintf (output_stream, "%s;",tokens[13]);

		fprintf (output_stream, "%s;",tokens[17]);

		fprintf (output_stream, "%s;",tokens[18]);

		fprintf (output_stream, "%s;",tokens[19]);

		fprintf (output_stream, "%s;",tokens[25]);

		fprintf (output_stream, "%s;",tokens[27]);

		fprintf (output_stream, "%s;",tokens[31]);

		fprintf (output_stream, "%s\n",tokens[38]);

		} //if( fgets(...) )

	}

	//schließen der beiden datein

	fclose (output_stream);

	fclose (input_stream);



	break;

   case 2:  printf("********** Vodafone **********\n");

              break;

   case 3:  printf("********** Programm wird beendet **********\n");

              break;

   default :  printf("********** Falsche Eingabe! **********\n");

              break;

}	

printf("Drücken Sie ENTER");

getchar();


}

 

so, hatte /n vergessen gehabt, mein wieder reinschreiben.

nun hat er 3 werte zuviel eingelesen, bzw falsch. *grml* aber nur am ende der jeweiligen zeilen.

1 zeile allerdings kommt nun völlig korrekt raus

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...