Probleme beim lesen von .csv-Datei



  • str[index] ist ein char und kein string, deswegen der & davor.
    es ginge auch str+index und ohne &.

    so und jetz lies "the c programming language, second edition" oder berichtige mich richtig.

    (soll nicht als angriff gemeint sein, nur als herausvorderung)



  • Und es geht doch mit scanf.

    #include <stdio.h>
    #include <string.h>
    
    void scan_it( const char * inp ) {
       int nr;
       char txt[50];
       char par[50];
       sscanf(inp, "%d;%[^;];%[^;\n]", &nr, txt, par );
       printf( "\nnr = %02d\ntxt= '%s'\npar= '%s'\n", nr, txt, par);
    }
    
    int main() {
       char *inp1 = "1;some text;pars-1";
       char *inp2 = "2;test;divx";
       char *inp3 = "3;noch einer;svcd";
       char *inp4 = "4;letzter test;dvd-r ";
       scan_it( inp1 );
       scan_it( inp2 );
       scan_it( inp3 );
       scan_it( inp4 );
    }
    
    nr = 01
    txt= 'some text'
    par= 'pars-1'
    
    nr = 02
    txt= 'test'
    par= 'divx'
    
    nr = 03
    txt= 'noch einer'
    par= 'svcd'
    
    nr = 04
    txt= 'letzter test'
    par= 'dvd-r '
    

    Kurt



  • nicht schlecht herr specht 🙂 das könnte ne gute lösung sein für mein problem. danke fürs kopfzerbrechen



  • [quote="c.rackwitz"
    es ginge auch str+index und ohne &.
    [/quote]

    Wenn ich folgendes mache:

    char    szString [11];
    
    strcpy (szString, "0123456789");
    
    printf ("%s\n", &szString [2]);
    
    printf ("%s\n", szString + 2);
    

    Erzeugt dies jedesmal den gleichen Output. Die erste ersion zeigt aber besser was passiert. Bei der zweiten Version werden eigentlich zwei Dinge vermengt: Ein int und ein Pointer. Das ist ein wenig wie das alte

    szString++; /* No-No!*/
    

    Moderne Compiler weigern sich einfach soetwas umzusetzen - aus guten Grund.



  • sorry, aber ich kenne keinen compiler, der sowas verweigert. und damit du den richtigen eindruck von mir hast:
    ich weiss, wie ich mit pointern umzugehen hab und ich hasse ungarische notation (aus gutem grund).

    natuerlich ist deine variante ok. allerdings aendert das nichts an der tatsache, dass ein char* einem printf nicht nochmal ein & braucht.

    die sache mit pointer++ solltest du auch akzeptieren. damit sparst du extra indexvariablen und schneller als str[index] ist es auch (inkrement <-> inkrement und addition). und damit du mich nicht fuer daemlich haeltst, ich inkrementiere keine arrays und wenn ich mit malloc() speicher geholt hab, dann gebe ich hinterher mit free() genau den selben pointer wieder frei (auch wenn ich den errechnen sollte...)

    im uebrigen hats nicht mehr viel mit dem thema zu tun.



  • OK - Man lernt nie aus. Ich bin da etwas gebranntes Kind und habe da offensichtlich meine Brandnarben vor 10 Jahren weitergefuehrt. Der gcc 3.3.3 gibt lediglich eine Warning aus, wenn die Variable von einer bestimmten Groesse im Stack definiert wurde. Also etwa

    char   *szString = "0123456789";
    
        szString++;
    

    (und selbst das nur wenn der -pedantic Flag gesetzt wurde; was ich aber aus lieber Gewohnheit immer mache; ist eigentlich auch gut zu stehen). Der gcc 4.0 laesst dies ohne Probleme durchgehen.

    Ich glaube, meine Abneigung kommt noch aus der Zeit, als staendig der Pointer und int miteinander vermischt wurden.



  • (soll nicht als angriff gemeint sein, nur als herausvorderung)

    25 die die Rechtschreibfehler in den Postings korrigieren 😮

    MfG SideWinder



  • ok, herausforderung mit f. aber was soll die 25 bedeuten?!?

    pointer und ints vermischen ist doch nichts boeses. sind ja beides nur zahlen... man muss es nur koennen *g*



  • c.rackwitz schrieb:

    pointer und ints vermischen ist doch nichts boeses. sind ja beides nur zahlen... man muss es nur koennen *g*

    Weil es zwei hoechst unterschiedliche Datentypen sind und solche nie miteinander vermischt werden duerfen. Das wiederspraeche den Grundsaetzen der strukturierten Programmierung.



  • hoechstunterschiedlich? duerfen niemals nicht mit einander vermischt werden?
    ein int ist signed, ein pointer nicht.
    ein int ist 1 machine-word breit, ein pointer auch (erschiess mich doch, wenn du ne architektur findest, wo das nicht so ist!)
    sonst noch unterschiede? noe.
    ja klar, das typsystem gibts nicht, damit ich es ignorieren kann. es hat seinen sinn und ist hilfreich. aber deswegen darf ich es doch auch mal umgehen, wenns mir gerade passt, oder?

    es wuerde gewissen grundsaetzen widersprechen?
    also wirklich. das klingt ja geradezu, als ob ich da was unmoralisches machen wuerde.

    es gibt da so ein schoenes wort: "glaubenskrieg".
    ich denke, man sollte jedem seine freiheit lassen.
    dazu gehoert auch, jemandem seinen schlechten stil nicht unter die nase zu reiben, was nicht heisst, dass man diesen dann auch akzeptieren muss, wenn man mit dem code arbeiten soll.

    (hab meinen post absichtlich sarkastisch geschrieben und kann diesen sarkasmus nur als form des humors rechtfertigen. mir war einfach danach. fuehle dich bitte nicht persoenlich angegriffen, ist nicht so gemeint)

    SideWinder: die frage aus meinem post weiter oben steht noch...


Anmelden zum Antworten