Ende vom letzten String



  • Hallo

    1. Wenn ich eine Datei auslese schreibt er mir Zeilennummern aber mehr als es sollte. Wahrscheinlich weil das EOF weiter unten steht. Wie könnte ich das ändern.
    while(!feof(pfile))
            {
                fgets(string,150,pfile);
                i++;
                printf("%d. %s",i,string);
    
            }
    
    1. Jetzt brauche ich noch ein Programm welches mir in einer anderen Datei die int und float Zahlen hinschreibt.
      Mit isdigit kann ich einzelne Zahlen ausschreiben. Wie erkennt es aber dass es Zahlen mit mehr Stellen oder float Zahlen sind.

    MfG



  • zu 1.:

    char *trim(char *str) { // Das hab ich Google geklaut.
       char *out = str;
       int len = strlen(str);
       for (int i=0; i<len && isspace(str[i]); i++, out++);
       for (int i=len-1; i>=0 && isspace(str[i]); str[i]=0, i--);
       return out;
    }
    
    while(!feof(pfile))
    {
       fgets(string,150,pfile);
    
       char* tmp=trim(string);
       if(strlen(tmp)==0)
          break;
    
       i++;
       printf("%d. %s",i,string);
    }
    

    zu 2.:

    Wie wärs mit atoi / atof oder gar strtod ?



    1. Ich habe versucht zuerst mit fgetc einzulesen. Da ich aber denke dass er bis zum Zahlenende nicht erkennen würde ob es sich um einen Integer oder Float handelt, da es nur Zeichen einzeln auswertet, habe ich es per fgets gemacht.

    2. Irgendwas habe ich bei dieser Art auch falsch gemacht da es diesen Fehler ausgibt.Woran könnte das liegen

    main.c|27|error: subscripted value is neither array nor pointer|

    while(!feof(pfile))
            {
    
            fgets(string, 150, pfile);
    
            if(isdigit[string]!=0)
            {
                if((n=atof(string))!=0)
                printf("Float: %f", n);
                if((i=atoi(string))!=0)
                printf("Int.: %d",i);
            }
    


  • fgets(string, 150, pfile);
    if(isdigit[string]!=0) {...}
    

    Wenn string als Puffer für fgets() durchgeht, dann kann's kein Index mehr sein.
    Wenn du das wirklich so sagen willst, dann auf diese Weise:

    if(isdigit[(int)string]!=0)
    

    Ich nehme aber an, daß du das so gemeint hast:

    if(isdigit(string)!=0)
    

    🙂



  • Danke. Auf diesen Fehler bin ich auch gekommen und habe es auch ausgebessert.

    Aber irgendwas stimmt trotzdem mit meinem Code nicht.

    Es zeigt mir diesen Fehler an.

    warning: passing arg 1 of `isdigit' makes integer from pointer without a cast

    Wenn ich das Programm ausführe überspringt es das ganze Programm und es steht wieder.

    c:\......

    if (pfile != NULL)
        {
            while(!feof(pfile))
            {
    
            fgets(string, 150, pfile);
    
            if(isdigit(string)!=0)
            {
                if((n=atof(string))!=0)
                printf("Float: %f", n);
                if((i=atoi(string))!=0)
                printf("Int.: %d",i);
            }
    


  • Sorry, das hab ich übersehen.
    Es muß natürlich heißen:

    isdigit(*string)
    /* oder */
    isdigit(string[0])
    


  • Ich habe beide Varianten probiert. Es kommt wieder nur eine leere Zeile.

    Wenn ich einen String habe.

    "xxxxx 1235 xxxxxxxx 131.654654 xxxxxxxxx 21 xxx"

    Bezieht sich das isdigit immer nur auf den ersten char oder auf die Zeile.



  • Ich habe es ausprobiert.

    Es schreibt Zahlen nur wenn es auf string[0] ist.

    1. Ich brauche aber Zahlen mitten im Text.

    2. Es gibt mir die Zahl als Int und Float. Es soll mir aber nur die Zahl wenn es ein Int als Int ausgeben, und bei Float nur als Float



  • Wenn ich einen String habe.

    "xxxxx 1235 xxxxxxxx 131.654654 xxxxxxxxx 21 xxx"

    Bezieht sich das isdigit immer nur auf den ersten char oder auf die Zeile.

    man: isdigit

    Es schreibt Zahlen nur wenn es auf string[0] ist.

    So war's auch gedacht.
    Wenn nämlich vor der Zahl noch seltsame Zeichen kommen, verweigern
    auch atoi und atof den Dienst.

    Da hilft's dann nur mehr, mit einer Schleife die seltsamen Zeichen zu überspringen.



  • Es zeigt mir schon wieder nicht die Zeichen mitten im Text an. Und wieder zeigt er mir unterschiedliche Zahlen nur als Float und öfters als sie vorkommen.

    if (pfile != NULL)
        {
            while (!feof(pfile))
            {
    
                fgets(string, 150, pfile);
                length=strlen(string);
                printf("%d\n",length);
    
                for (a=0; a<length; a++)
                {
                    if (isdigit(string[a]) != 0)
                    {
                       if ((n=atof(string))!=0)
                        {
                            printf("Float: %f\n", n);
                        }
                        else if ((i=atoi(string))!=0)
                        {
                        printf("Int.: %d\n",i);
                        }
                    }
                }
            }
        }
    

Log in to reply