Forum: PC-Programmierung csv datei einlesen


von Schüler94 (Gast)


Lesenswert?

Hallo ich bin Schüler und fange gerade an mich mit C zu beschäftigen.
Habe von meinem Lehrer eine Aufgabe zu EM bekommen. ICh soll aus eine 
csv Datei Daten einlesen und dann weiter bearbeiten.Leider komme ich 
nicht über das erste if hinaus. Kann mir jemand sagen wo mein Fehler 
liegt?
1
#include <stdio.h> 
2
#include <stdlib.h> 
3
#include <string.h> 
4
5
#define MAX_DATENSAETZE 32 
6
#define MAX_ZEILENLAENGE 128 
7
8
9
#define FLDLEN_NAME             17 
10
#define FLDLEN_VORNAME             17 
11
#define FLDLEN_GEBURHTSTAG        11 
12
#define FLDLEN_VEREIN             33 
13
14
15
const char *position[] = { 
16
    "Tor", 
17
    "Abwehr", 
18
    "Mittelfeld", 
19
    "Angriff" 
20
}; 
21
22
/* 
23
 * 
24
 */ 
25
struct spieler  { 
26
27
    int trikot; 
28
    int position_code; 
29
    char name[FLDLEN_NAME]; 
30
    char vorname[FLDLEN_VORNAME]; 
31
    char geburtstag[FLDLEN_GEBURHTSTAG]; 
32
    char verein[FLDLEN_VEREIN]; 
33
    int spiele; 
34
    int tore; 
35
36
}; 
37
38
39
typedef struct spieler Spieler; 
40
41
42
43
int main(void) 
44
{ 
45
    FILE *LeseDaten = NULL; 
46
    int x = 0; 
47
    Spieler xSpieler[MAX_DATENSAETZE]; 
48
49
   LeseDaten = fopen("C:\\Benutzer\\test\\xt.csv","r");  
50
    if(LeseDaten == NULL) 
51
    { 
52
        printf ("Fehler beim Oeffnen der csv\n"); 
53
        fflush(stdin); 
54
        getchar(); 
55
        return 1; 
56
    } 
57
     while((fscanf(LeseDaten, "%d,%d,%s,%s,%d,%s,%d,%d\n", 
58
     xSpieler[x].trikot,xSpieler[x].position_code,xSpieler[x].vorname,xSpieler[x].name, 
59
     xSpieler[x].geburtstag,xSpieler[x].verein, xSpieler[x].spiele,xSpieler[x].tore)) != EOF) 
60
     { 
61
           x++; 
62
     } 
63
      printf("%d, %d, %s\n", xSpieler[0].trikot, xSpieler[0].position_code, xSpieler[0].vorname);         
64
      printf("%d, %d, %s\n", xSpieler[1].trikot, xSpieler[1].position_code, xSpieler[1].vorname); 
65
     fflush(stdin); 
66
     getchar(); 
67
     return 0; 
68
}

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Schüler94 schrieb:
> Leider komme ich nicht über das erste if hinaus.
> Kann mir jemand sagen wo mein Fehler liegt?

der besteht darin, daß du nicht beschreibst, warum du "nicht über das 
erste if hinaus kommst".

Gibt es einen Übersetungsfehler des Compilers, oder wird eine andere 
Datei geöffnet, oder schaltet sich die Kaffemaschine statt dessen ein, 
oder was passiert anstelle dem was du erwartest?

von Rolf M. (rmagnus)


Lesenswert?

Kleiner Tip noch: Wenn du innerhalb der Abfrage statt printf() die 
Funktion perror() nutzt, wird auch ausgegeben, welcher Fehler 
aufgetreten ist.
Dazu mußt du nur perror()  statt printf() nutzen und das \n am Schluß 
wegmachen (perror schließt die Zeile für dich ab).

von Schüler94 (Gast)


Lesenswert?

Er kann die Datei nicht öffnen ich weis aber nicht warum.

von Karl H. (kbuchegg)


Lesenswert?

Und wenn du die Datei dann öffnen kannst, dann rate ich dir dringend 
dazu, deinen Code NICHT Zeichen an Zeichen auf Knirsch zu schreiben. Du 
DARFST zwischen "Wörter" Leerzeichen einstreuen. Du darfst dort auch die 
Zeilen umbrechen. Gerade bei den typischen langen Argumentlisten zu 
scanf (in deinem Fall fscanf) ist es besonders wichtig, dass man leicht, 
schnell und fehlerfrei die Zuordnung des Symbols in der Formatliste zur 
Variablen herestellen kann
1
     while((fscanf(LeseDaten, "%d,%d,%s,%s,%d,%s,%d,%d\n",
2
                              xSpieler[x].trikot,
3
                              xSpieler[x].position_code,
4
                              xSpieler[x].vorname,
5
                              xSpieler[x].name, 
6
                              xSpieler[x].geburtstag,
7
                              xSpieler[x].verein,
8
                              xSpieler[x].spiele,
9
                              xSpieler[x].tore)) != EOF)

steht im Formatstring ein %d, dann musst du die Adresse eines int 
angeben. Das tust du aber nicht! da fehlen ein paar &
Bei einem %s allerdings, ist der Name des Arrays bereits die Adresse. Da 
braucht man dann keine &

von Karl H. (kbuchegg)


Lesenswert?

Schüler94 schrieb:
> Er kann die Datei nicht öffnen ich weis aber nicht warum.

* Die Datei ist am richtigen Ort
* Tippfehler in Datei oder Pfadangabe
* Datei in einem anderen Programm geöffnet
* Von einem vorhergehenden Versuch ist die Datei im Betriebssystem
  als geöffnet markiert
* Keine Berechtigung, die Datei von dort zu öffnen
* ....

Da gibts viele Möglichkeiten

von Vlad T. (vlad_tepesch)


Lesenswert?

Schüler94 schrieb:
> LeseDaten = fopen("C:\\Benutzer\\test\\xt.csv","r");
                           ^^
funktioniert das Öffnen der Dateien so?

Ich hatte mal irgendwelche Probleme, durch diese 
Windows-Phantasie-Namen.

Was man auch häufig beobachten kann:
Der Explorer Zeigt das Verzeichnis C:\Programme zwar an, installiert man 
aber ein Programm explizit nach C:\Programme hat man auf einmal 2 
Verzeichnisse diesen Namens. Vorauswahl ist in den Installern auch meist 
c:\program files, wo nach erfolgreicher Installation das Programm dann 
unter c:\Programme auftaucht.

Was ich sagen will: vielleicht ist das ein Problem mit diesen virtuellen 
Windows-Datei/Pfad-Namen.
leg mal deine Datei in einen selbsterstellten Ordner direkt unter C (und 
vergiss nicht den neuen Pfad einzucodieren)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Schüler94 schrieb:

>      while((fscanf(LeseDaten, "%d,%d,%s,%s,%d,%s,%d,%d\n",
>      xSpieler[x].trikot,xSpieler[x].position_code,xSpieler

%d-Argumente erwarten einen Zeiger, wo der Wert hingeschrieben werden 
kann:

& xSpieler[x].trikot

Die %s-Parameter sind ok so.

von Robert L. (lrlr)


Lesenswert?

>Schüler94 schrieb:
>> LeseDaten = fopen("C:\\Benutzer\\test\\xt.csv","r");
                           ^^
>funktioniert das Öffnen der Dateien so?

das muss mit ziemlicher Sicherheit c:\Users\test\... lauten

von Vlad T. (vlad_tepesch)


Lesenswert?

Robert L. schrieb:
> das muss mit ziemlicher Sicherheit c:\Users\test\... lauten

das ist doch schrott.
Ich hab immer noch XP aber bei meinem Bruder oder Eltern die Vsta/win7 
haben hat mich das angekotzt.

Man bekommt überall verschiedene Namen für das selbe Verzeichnis und je 
nach Kontext ist nur einer richtig.
Entweder man macht das ganze richtig und das OS handelt es komplett 
intern und der Benutzer/Programmierer bekommt gar nix davon mit, oder 
man lässt es ganz.

von was? (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> Entweder man macht das ganze richtig und das OS handelt es komplett
> intern und der Benutzer/Programmierer bekommt gar nix davon mit, oder
> man lässt es ganz.

Als Programmierer benutzt du einfach die Windows API und gut ist.

von Robert L. (lrlr)


Lesenswert?

>hat mich das angekotzt.



bei XP ist das aber wesentlich schlechter gelöst
da ist es je nach Sprache des system wo anders..

von Frank (Gast)


Lesenswert?

Man baut Programme "schichtenweise" auf, die man jeweils einzeln testet, 
dann findet man auch schneller die Fehler. Und man macht erst dann mit 
dr nächsten Schicht weiter, wenn die darunter liegende Schicht läuft. 
Also z.B.:

- datei öffnen, schliessen ... Datei gefunden, Handle true?

- aus Datei Zeile für Zeile lesen (und anzeigen) bis Ende . Wird sauber 
auf EOF reagiert, gibts keine Exception?


- dann die gelesenen Zeilen an den Kommata teilen, anzeigen

- usw.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

was? schrieb:
> Vlad Tepesch schrieb:
>> Entweder man macht das ganze richtig und das OS handelt es komplett
>> intern und der Benutzer/Programmierer bekommt gar nix davon mit, oder
>> man lässt es ganz.
>
> Als Programmierer benutzt du einfach die Windows API und gut ist.

Das is jetzn Scherz, oder?

Es geht doch darum, anhand eines kleinen Beispiels C zu lernen.
Und nicht darum, wie man um ein verkorxtes Betriebssystem rumhackt und 
sich nebenbe noch mehr Systemabhängigkeiten reinzieht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.