Problem beim Einlesen Datei-wie gehts?????



  • Hallo,

    hab folgendes Problem:

    Muss ein Programm schreiben,dass aus einer .csv Datei einliest.Programm soll die Daten per Terminal(cat...) übergeben kriegen.
    Wie kann ich das einlesen in ein Array? Wenn ich die Datei als File einlese krieg ich es hin,aber wie ich die Daten am stdin abgreife ist mir ein Rätsel.

    Jemand ne Idee? 😕



  • Ganz einfach von stdin lesen ^^

    #include <stdio.h>
    
    int main() {
    	char buffer[BUF_SIZE];
    	int read;
    
    	read=fread (buffer,1,BUF_SIZE,stdin);
    	buffer[read]='\0';
    	printf("%s\n",buffer);
    	return 0;
    }
    
    $ cat hallo.txt
    hallo
    du
    $ cat hallo.txt | ./stdin
    hallo
    du
    


  • Danke für deine Antwort. Hilft mir allerdings nicht wirklich.

    Was ist denn an dem Code hier falsch? Der wird zwar anstandslos kompiliert aber es wird nur 0.0 in jede Zelle eingelesen.

    [/code][cpp]
    while((c=getc(stdin)) != EOF){
    for (i=0;i<10;i ++) {

    fscanf(stdin,"%f",&tabl[i]);

    }
    printf("Wert %f\n\n",tabl[i]);

    }[code]



  • günstiger wäre folgender ansatz (meiner meinung nach...):

    du liest die datei von stdin zeile für zeile. die funktionen dazu wären fgets bzw. getline, falls du linux verwendest. getline ist eine gnu extension, die zwar sehr nützlich ist, aber keinem standard entspricht. sie ist damit nicht portabel.

    sobald du eine zeile eingelesen hast, kannst du sie per strtok parsen. damit bekommst du alle zellen einer zeile der csv heraus. dann parst du die einzelnen werte.

    diese lösung trennt die verschiedenen schritte mehr voneinander als deine getc methode es tut.



  • Danke für deine Antwort. Also hab jetzt folgenden Ansatz

    while ((fgets(test1,80,stdin)) !=NULL) {
      test=test1[0];
      if (test=='-' ||test=='0'||test=='1'||test=='2'||test=='3'||test=='4'||test=='5'||test=='6'||test=='8'||test=='9'){
    
    	  printf("habe zahl gefunden");
    	  for(i=0; i<FELD; i++)
    	  {
    		fscanf(stdin,"%f",&tabl[i]);
    		 	    }
    	  }
      else{;}
    }
    
    return 0;
    

    Jetzt hab ich aber das Problem,dass er erst die 2.Zahl erfasst und die erste irgendwie verloren geht.Also muss da ja noch n Fehler drin sein,blos wo?? 😮



  • zum einen brauchst du das "else {;}" nicht. aber das weißt du eh bestimmt schon.
    zum anderen gibt es eine bessere methode, zu prüfen, ob ein zeichen eine ziffer ist:

    if((test >= '0') && (test <= '9')) {
    

    diese methode hat den vorteil, dass man nur zwei bedingungen hat und nicht 10 auswerten muss.

    das zweite ist das parsen. ich würde dir empfehlen, strtof oder ähnliches zu verwenden und auf der zeile, die du schon eingelesen hast, zu arbeiten. mit fscanf liest du das zeug unter umständen erneut ein, was unnötig ist.
    bedenke allerdings, dass bei einer csv die zellen durch beistriche getrennt sind und eine fließkommazahl auch einen enthält. wie genau ist das bei dir escaped?



  • Nochmals Danke,mal sehen was ich aus deinen Tips bastele 😃

    Die .csv Datei wird mit nem cut Befehl so gestutzt,dass nur ein paar Headerzeilen bleiben und dann nur noch ein Wert je Zeile über bleibt,die dann wohl mit \n escaped sind.

    Das else ist noch n Überbleibsel aus einem Try and Error.



  • Also komme mit den string funktionen gar nicht klar.Hab jetzt aber verstanden warum meine erste Zahl nicht erscheint,der stream scheint mit dem fscan erst von der stelle an weiter gelesen zu werden,an der fgets stoppte.Kann ich das irgendwie eins zurück setzen?



  • was genau klappt mit strtof nicht? es ist wirklich die beste lösung, da du die daten ja schon eingelesen hast.

    der erste parameter der funktion ist dein test1 string, der zweite parameter kann in deinem fall NULL sein, da du ja meinst, dass du nur einen wert pro zeile hast. setzt du dort die adresse eines pointers ein, wird in diesen pointer einfach die adresse, an dem der restliche string der zeile startet, gespeichert. der rückgabewert der funktion ist der float wert.



  • Abermals Danke für deine Erklärungen!!!

    Also mein Problem waren die Syntax mit der ich diese Funktion einbinde.Die Erklärungen dazu hab ich n Tick zu abstrakt gefunden und nid verstanden-deine gibt mir jetzt Anhaltspunkte für weiteres Experimentieren 🕶



  • Besserwisser,

    hasts besser gewusst!!! 😃

    Jetzt läuft alles so wie ich das will,obwohl ich glaub ich nur n work-around gefriemelt hab. Ich les den test1 aus wandel den um und ordne ihn als 1.Zelle den restlich fscan eingelesenen dazu.


Anmelden zum Antworten