Datei Operationen



  • Hi Leute,

    Wie macht man es möglichst einfach, eine Datei
    zu öffnen, alles einzulesen und dann an "\n" zu splitten,
    oder geht das in C nicht, bin etwas verwöhnt, komme aus der Python Welt.
    Die gesplitteten Teile hätt ich gern in was Listen ähnlichem, was in
    C wohl Array genannt wird.
    Wenn jemand ein CodeSnippet posten könnte wär ich dankbar.

    MfG Jonas



  • Wie macht man es möglichst einfach, eine Datei
    zu öffnen, alles einzulesen

    ZB mit man: fseek die Größe herausfinden, mit man: fread lesen, mit man: strtok aufteilen.
    Oder doch gleich mit man: fgets zeilenweise einlesen.

    Die gesplitteten Teile hätt ich gern in was Listen ähnlichem, was in
    C wohl Array genannt wird.

    Da sehe ich wenig Ähnlichkeit, außer der Eigenschaft mehrere Dinge zu umfassen.



  • Wenn ich was Verwandschaft Listen/Arrays falsch informiert war, Sorry!
    Danke für die Links.

    MfG Jonas 😉



  • Wenn ich was Verwandschaft Listen/Arrays falsch informiert war, Sorry!

    Macht ja nix! 🙂

    Überleg dir mal, warum man in Python so vorgehen muß:

    liste = [1, 2, 3]    # ganz einfach
    arr = array.array('i', [1, 2, 3])    # ich muss den "Typ" angeben
    


  • 6:00 und nicht mehr müde...
    Na dann schreib ich eben weiter:

    Wie macht man es möglichst einfach, eine Datei
    zu öffnen, alles einzulesen und dann an "\n" zu splitten,
    oder geht das in C nicht, bin etwas verwöhnt, komme aus der Python Welt.

    Das machst du hoffentlich in Python nicht so, sondern eher so:

    liste = []
    with open(r"c:\boot.ini", "r") as f:
        for line in f:
            liste.append(line)
    

    Also ohne Aufruf der split-Methode eines Strings, und ohne das ganze File auf einmal zu lesen.

    Und ähnlich würde ich das auch in C machen, aber:
    1.) C hat eigentlich keine Strings, sondern Arrays von Zeichen
    2.) C hat keine Listen (außer man baut sich welche), also ein Array von Zeigern auf Zeilen verwenden, oder ein zweidimensionales Array von Zeichen
    3.) Arrays haben feste Dimensionen in C, also auf Pufferüberläufe einstellen

    Ein denkbar einfaches Beispiel, aber in sehr schlechtem Stil, weil die Array-Größen hartkodiert sind:

    #include <stdio.h>
    
    #define ZEILEN_ANZAHL (100)
    #define ZEILEN_LAENGE (80)
    
    int main(int ac, char **av)
    {
        FILE *fp = fopen("c:\\boot.ini", "r");
        // 2d-Array von Zeichen ("Array von Strings")
        char zeilen[ZEILEN_ANZAHL][ZEILEN_LAENGE];    
        int i;
    
        if (!fp)
            return 1;   // konnte nicht oeffnen
    
        // Solange einlesen, bis fgets() NULL zurückgibt
        // zeilen könnte überlaufen, aber nur in der 1. Dimension (ZEILEN_ANZAHL),
        // die andere wird von fgets() beschützt
        for (i = 0; fgets(zeilen[i], ZEILEN_LAENGE, fp); i++)
            ;
    
        fclose(fp);
    
        // Testen, ob's funktioniert hat
        // i ist die Anzahl der Zeilen, solange keine Zeile länger
        // war als ZEILEN_LAENGE, wenn doch -- denk drüber nach!
        for (i-- ; i >= 0; i--)
            printf(zeilen[i]);
    
        return 0;
    }
    

    Wie du siehst, ist sowas nicht unbedingt eine der Stärken von C.

    (flamer)



  • Also in Python würde ich mich zwischen Datei ganz einlesen u.
    splitten bzw. Datei zeilenweise einlesen entscheiden, je nach-
    dem welche Dateimenge/größe vorliegt.

    MfG Jonas 🙂



  • Ja eh, mit split kriegt man's in eine einzelne Zeile, ich weiß.
    Läßt sich aber idiomatisch nicht so leicht nach C übertragen, also hab
    ich erstmal gemeckert.



  • Hi,
    wenn die Zeilen feste Längen haben und wenn es eine Textdatei ist, geht das am einfachsten mit fgets.

    Gruß,
    B.B.


Anmelden zum Antworten