DAtei öffnen --- auslesen
-
*grml*
#define ANZ_SPALTEN "45"
wahrscheinlich auch falsch, weil das guckt dann ja wo eine 45 steht, oder?
die datei die ich einlese hat 45 spalten
-
Jetzt bist du der Sache schon ganz nahe.
Der Compiler schaut aber nicht ob da irgendwo eine 45 steht, sondern er schaut, ob da ANZ_SPALTEN steht und ersetzt das momentan durch "45" (inclusive Anführungszeichen). Allerdings wirst du da noch Fehler bekommen, weil es so keinen Sinn macht (so würde es der Compiler ersetzen; BUFSIZ würde er natürlich auch durch eine Zahl ersetzen ;)):... char tokens["45"][BUFSIZ]; ...
Lass einfach die Anführungszeichen weg und schon passt es :).
(so sollte es dann vom Compiler ersetzt werden)
... char tokens[45][BUFSIZ]; ...
So würde es doch auch richtiger aussehen, oder?
-
so, es läuft
du bist klasse!
noch eine frage.
wenn ich jetzt die csv datei mitexel öffne, um zu gucken, wie das dort hineingeschrieben wurde, dann geht es immernoch nicht wirklich . d.h. es ist immernoch verschoben.soll ich dir die datei mal per email schicken, damit du siehst wie ich es meine?
-
Ja mach mal. Kann sie mir aber erst morgen vornehmen, sorry.
Schau dir die Datei einfach mal mit dem notepad (Start -> Ausführen -> notepad) an, vielleicht findest du dann den Fehler.
-
kann nichts auffälliges finden, was daran schuld sein könnte.
hab dir die datein mal zum web.de postfach geschickt.
-
nochmal genauer :
- in der ersten zeile gibt mein blödes prog ein paar sachen doppelt aus.
- und es schreibt das letzte eingelesene element in eine neue zeile, was das ganze durcheinander bringt
-
Hallo,
so spontan würde ich sagen die Zeile
fprintf (output_stream, "\n%s;",tokens[3]); ist falsch,
das haut zwar bei allen nachfolgenden Zeilen hin,bei der allerersten ist der
Zeilenwechsel aber überflüssig,ich würde ihn eher an die letzte frprintf Anweisung anhängen,bzw. das Zeilenende seperat schreiben.
Ich bin mir auch nicht 100% sicher ob ein \n reicht,vielleicht ist auch ein \n\r notwendig.Peter
-
#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(); }
das ist nun die aktuellste version.
nur verhaut der kompiler da einiges...anfang klappt es, danach würfelt er einiges durcheinander
-
Hallo,
ich vermute mal bis Zeile 1 letzer Eintrag stimmts,danach mach er mist?Oder ab welcher stelle genau?
Peter
-
ja genau, erste zeile stimmt, aber danach bringt er einiges durcheinander.
jemand von einen andern board hat es mal unter seinen linux compiler laufen lassen und da ging es wohl ohne probleme.
werde gleich mal mir noch andere compiler runterladen. denn ich find sonst keinen fehler mehr
-
Und mal mit /n/r probiert?
-
auch nicht
frag mich was nun noch daran falsch ist *grrrrrrrrrrrrrrrrrrrr*
ich will das endlich fertig haben
-
Hallo,
du solltest außer dem dieses /n oder /n/r an eine Feste Position in der Ausgabezeile schreiben,führt ansonsten zu Problemen wenn ein Feld mal leer ist.Peter
-
wie meinst du das?
wie umsetzen?
-
Hallo,
probiers mal hiermit:
fprintf (output_stream, "%s\n\r",tokens[38]);Ach übrigens bei diesen fprintf,was ist mit token[0] ???
mfg
Peter
-
ok, dann hab ich es doch richtig verstanden.
so hatte ich es gesetzt, hilft aber nicht. bleibt immernoch alles gleich.was soll mit mit token[0] sein? ich hab es mitgezählt, also ich hab bei 0 angefangen zu zählen. aber 0 soll ja nicht ausgegeben werden .
-
Hallo,
also token[0]=Zeilenüberschrift oder so?
tja was schreibt er den? bzw,was stimmt da genau nicht?Peter
-
lol, fällt mir ja jetzt erst auf.
ich fang mit tokens[3] , dies soll die ersten werte ausgeben. aber nicht die überschrift.
allerdings gibt er die überschrift aus, die eigentlich in token[0] steht.
komisch..irgendwas ist falsch schon am anfang beim einlesen. werd es mir nochmal anschauen
-
vergiss mein letztes posting..war schwachsinn..war net bei der sache