fgets() will nich so wie ich ^^



  • Guten Abend!

    Ich versuche mich an einem Programm zur Speicherung von Verbuchungen der
    Doppelten Buchführung (Rechnungswesen)

    Bevor ich jedoch mit dem Projekt beginne, muss ich erst ein mal den Part mit den
    FILE in den Griff kriegen.

    Also, ich schreibe 20 zeilen in eine Textdatei, was auch ohne probleme funktioniert! beim auslesen jedoch gibt es ein kleines problem, es werden lediglich 7 zeilen gespeichert. die schleife läuft jedoch 20 mal durch (hab per breakpoint debbugt).

    Hier mal der Source-code:

    #include "stdafx.h"
    #define MAX 20
    
    void writeID();
    void readID(char str[][MAX]);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        char str[MAX][MAX];
    
        writeID();
    
        readID(str);
    
        for(int i=0; i<MAX; i++)
            printf("%s", str[i]);
    
        system("PAUSE");
        return 0;
    }
    
    void writeID(){
    
        FILE *dat=fopen("Data.txt","w");
    
        for(int i=1; i<=MAX; i++)
            fprintf(dat,"0%d\n",i);
        fclose(dat);
    }
    
    void readID(char str[MAX][MAX]){
    
        FILE *dat=fopen("Data.txt","r");
        int i=0;
    
        for( ; i < 20; i++){
            fgets(str[i],2,dat);
            printf("%s", str[i]);
        }
    
        fclose(dat);
    }
    

    Wie schon gesagt, es sind nur kleine spielereien um zu verstehen wie das ganze funktioniert.

    Entwicklungsumgebung: Visual Studio 2008
    Project: Win-32 Consolen Anwendung

    Weiteres: um mir zeit und streß zu ersparen, wäre ich froh, wenn ich wüßte nach was ich genau suchen müsste, wenn ich die eingelesenen Zeichen (char) in einen Integer umwandeln kann. Oder gleich eine lösung, wobei es ja immer heißt: gidf
    Aber wenn ich nicht weiß nach was ich genau suchen soll, spuckt google nur nen haufen Misst raus ^^

    Grüße
    ITEDVO



  • Ersetze mal bei fgets die 2 durch 20 und lies die Spezifikation zu fgets!

    Richtig lesen tut man aus einer Datei, indem man nicht nur die robustesten Standardfunktionen zum Lesen benutzt, sondern auch deren Rückgabewerte auswertet, dazu sind diese nämlich da, also z.B. für deinen Fall, dass max. 20 gültige Integer aus einer zeilenorientierten Textdatei gelesen werden sollen:

    int liste[20],i=0;
    char zeile[100]; /* Zeilenlänge max. 99 */
    
    FILE *fp = fopen("bla.txt","rt");
    if( !fp )
      perror("bla.txt"),exit(1);
    
    while( fgets(zeile, sizeof zeile, fp) )
      if( i<sizeof liste )
        if( 1==sscanf(zeile,"%d",&liste[i]) )
          ++i;
    printf("\n%d Zahlen wurden gelesen",i);
    fclose(fp);
    

    Auch ist es schlecht, kurze prägnante defines zu verwenden (MAX), es könnte nämlich sein, dass diese schon in den Headern definiert sind und du sie quasi überschreibst (der Compiler warnt je nach Einstellung nicht immer davor). Das führt oft zu aufwändigen Debug-Orgien.



  • Hi

    Beschäftige dich nochmals mit Pointer ,Arrays ,etc..

    fgets(str[i],2,dat);
    

    eher so ...

    fgets(&str[i],2,dat);
    
     // Und du weisst schon, dass du hier nichts einliest, bzw. nur das new-line Zeichen (dass fgets anhängt) und die 0 Terminierung. Daher verstehe ich nicht ganz warum du nür (MAX) 2 Byte einlesen willst ?
    

    etc etc ...

    lowbyte



  • HI

    @wutz

    sorry dein Post habe ich nicht gesehen bzw. warst schneller. 😉

    lowbyte



  • ok, das "&" hab ich wahrlich übersehen bzw. darauf vergessen.

    @wutz: danke für die hilfestellung, ich setze mich gleich dran =b



  • @lowbyte_: ich hätte lieber noch ein mal nachdenken sollen bevor ich dir recht gebe bezüglich dem array. so übergebe ich der funktion "readID(char str[][MAX])" den 2 dimensionalen Array ja auch nicht über ein "&" (also auf die adresse). daher kann ich dann im unterprogramm dann nicht für fgets einen zeiger auf die adresse werfen, weil ja der name schon die adresse ist.

    weil setze ich hier ein "&" hab ich nen zeiger auf die adresse. aber ich brauch nen zeiger auf nen zeiger. und das mach ich ja schon mit str[i]!

    und damit du mir glaubst, hier:

    1>c:\users\itedvo\documents\visual studio 2008\projects\datenbank_t00\datenbank_t00\datenbank_t00.cpp(43) : error C2664: 'fgets' : cannot convert parameter 1 from 'char (*)[20]' to 'char *'
    1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    1>Build log was saved at "file://c:\Users\ITEDVO\Documents\Visual Studio 2008\Projects\Datenbank_T00\Datenbank_T00\Debug\BuildLog.htm"
    1>Datenbank_T00 - 1 error(s), 2 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

    die zwei warnungen sind, weil ich noch nicht überprüft hab ob die dateien richtig geöffnet werden, daher ^^ mach ich wenn ich wieder @home bin =b



  • so übergebe ich der funktion "readID(char str[][MAX])" den 2 dimensionalen Array ja auch nicht über ein "&" (also auf die adresse).

    1. Es handelt sich dabei um eine deklaration. Beim Aufruf schreibst du richtig read ID(str)

    2. str[i] == *(str + i)

    3. &str[i] == &*(str + i) == str + i

    str ist ein const ptr

    MfG


Anmelden zum Antworten