Öffnen und Erzeugung einer Textdatei in C



  • Aha. Wir sollen dir deine Hausaufgaben machen.
    Du weißt nicht, wie du ein Array befüllst?
    Dann musst du im Unterricht besser aufpassen, das sind absolute Grundlagen.



  • das habe ich nicht gesagt bzw geschrieben! wäre es so wie du es darstellst dann würde ich ja demnach alle aufgabenstellungen einfach hier runter schreiben, jedoch ist das nicht der fall! ich habe nur ein problem und das habe ich oben bereits oben aufgeschrieben.



  • Wenn du uns nicht zeigst was du probierst, können wir dir nicht sagen, wo der Fehler ist.

    In deinem bisher geposteteter Code kommt davon nichts vor.



  • wie bewerkstellige ich genau den lesevorgang ? ich denke mir die ganze zeit wenn ich die datei einlese dann muss ich doch ein bestimmtes limit angeben dass zb die ersten 3 zahlen gelesen werden,jedoch haben die Zahlen unterschiedliche stellen.



  • Welches Problem?

    scanf liest immer soweit, wie die Zeichen zum Formatspecifier passen.

    Zeig doch endlich den relevanten Code.



  • mein aktueller stand ist der code den ich vorhin hier veröffentlicht habe. ich bin total unsicher und kenne mich nicht gut aus mit der high level programmierung. ich weiss momentan nicht einmal wie ich es schaffe die dateien auszulesen und im array abzuspeichern.

    ich habe keinen ansatz wie ich fortfahren soll



  • Zwecklos. Klassischer Noob.
    Kann mit einfachsten Hinweisen und Beispielcodes angeblich nichts anfangen und will hier C von grundauf gelehrt bekommen.



  • Mitr folgendem (ungetesteten) Code solltest du deine Datei ohne Kommas lesen können

    int daten[200], anzahl_daten=0;
    
    while (1 == fscanf(fp,"%d",&daten[anzahl_daten]) && 1) //die letzte 1 durch Test auf Arrayüberlauf ersetzen
    { anzahl_daten++;
    }
    
    for(int j=0;i<anzahl_daten;j++)
      printf("%3d : %5d\n", j, daten[j]);
    


  • Erst einmal vielen Dank. ich habe es eben versucht aber die Werte werden nicht aufgenommen, stattdessen entstehen andere Werte.



  • ich habe mich jetzt intensiv mit der ausgabe befasst und auch eine ASCII tabelle hinzugenommen. Mir fiel auf, dass die Werte stets einzeln eingelesen werden.
    beim ersten wert zb einer 1 klappt es noch aber beim nächsten wert zb 324 klappt es nicht mehr. als ich int array zu einem char array umgeändert habe wurde plötzlich die kommas mit eingelesen.



  • habe nun etwas weiter dran gearbeitet und konnte es schaffen, dass die kommas weggelassen werden. Aber mein Problem, dass nur einzelne Zahlenwerte eingelesen werden bleibt weiterhin bestehen.

    unsigned char daten[200];
        int anzahl_daten=0;
    
        while (1 == fscanf(vorgabe,"%c",&daten[anzahl_daten]) && 1) {//die letzte 1 durch Test auf Arrayüberlauf ersetzen
    
            if(daten[anzahl_daten]==44){
                daten[anzahl_daten]=0;
                anzahl_daten--;
            }else {
            anzahl_daten++;
        }
        }
    


  • Du willst Zahlen einlesen, keine Ziffern!
    128 ist eine Zahl aus den Ziffern '1' und '2' und '8'

    Die Zahl 128 hat auch den Wert 128. Während '1' ein Zeichen ist und einen anderen Wert hat (bei ASCII ist das 49)

    Mit den Ziffern alleine lässt sich nicht so einfach rechnen.
    Darum bietet dir scanf die Möglichkeit gleich Zahlen einzulesen.
    Dabei werden führende Leerzeichen (Whitespace) sogar überlesen und die Eingabe endet beim ersten Zeichen, dass nicht mehr zur Zahl passt (Whitespace, Buchstaben, Sonderzeichen, ...).

    Bis auf Whitespace müssen diese Zeichen aus der Eingabe entfernt werden, wenn du wieder eine Zahl lesen möchtest.
    Darum ist das ohne Komma so viel einfacher.

    Wenn du das verstanden hast, kannst du dich um das Komma kümmern.

    scanf ist eine mächtige Funktion und man muß wissen, welche Bedeutung die Zeichen im Formatstring haben.
    Schließe nicht von printf auf scanf



  • ich hab mir nun näher angeschaut und habe meine Strategie nun nochmal geändert und kam zum Entschluss, dass ich die werte in der Textdatei in einem string-array abspeichern möchte und die Funktion strtok verwenden möchte die es mir erlaubt ausgewählte Zeichen zu unterbinden.
    Ich habe es geschafft dass die Tabelle erstellt wird mit den zahlen, jedoch kann ich nun nicht den Mittelwert bilden da es sich um einzelne Zeichenketten handelt und die Berechnung durch 2 mir nicht korrekte Zahlenwerte ausgibt. Gibt es eine Möglichkeit dies zu beheben ? Außerdem wird mir der erste Wert in der Tabelle als (null) eingetragen, wieso ?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main () {
    
        int x;
        int i;
        int j;
    
        FILE *vorgabe;
        FILE *tabelle;
    
        char delimiter[] = ",";
        char *ptr;
    
        // Datei oeffnen
        vorgabe = fopen("werte.txt", "r");
    
        if(vorgabe == NULL) {
            printf("\n\nDie Datei konnte NICHT geoeffnet werden.\n");
        }else {
            printf("\n\nDie Datei konnte geoeffnet werden.\n\n\n");
        }
    
        //Zahlen aus Textdatei einlesen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
        char string[200];
        int daten[200];
        int anzahl_daten=0;
    
        ptr = strtok(string, delimiter);
    
        while (1 == fscanf(vorgabe,"%s",&string[anzahl_daten]) && 1) {//die letzte 1 durch Test auf Arrayüberlauf ersetzen
    
           /* if(daten[anzahl_daten]==44){
                daten[anzahl_daten]=0;
                anzahl_daten--;
            }else { */
    
            anzahl_daten++;
    
        }
        //}
    
        i=0;
    
    while(ptr != NULL) {
    	printf("Abschnitt gefunden: %s\n", ptr);
    	// naechsten Abschnitt erstellen
     	ptr = strtok(NULL, delimiter);
     	daten[i]=ptr;
     	++i;
    }
    
        //EINLESEN ENDE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
        //Datei schreiben und befüllen mit fprintf
        tabelle = fopen("mittelwerte_M_N.txt","w");
        fprintf(tabelle, "Messzeitpunkt\tMesswert\tMittelwert\tStatus\n\n");
    
        //befüllung der Textdatei mit den Werten
        for(i=0;i<37;i++) {
            double MW= ((double)daten[i]/2);
            fprintf(tabelle,"%d\t\t%s\t\t%.2lf\t\t%d\n",i,daten[i],MW ,i);
        }
    
        printf("Die Tabelle mit den erzeugten Dateien wurde erfolgreich erstellt.\n\n");
    
        // Datei schliessen
        fclose(vorgabe);
        fclose(tabelle);
    
    return 0;
    
    }
    


  • Das ist Schrott.

    Du hast C-Strings und fscanf nicht begriffen.

    Warum brauchst du ein String-Array? (Hast du auch nicht, du hast ein char-Array)
    Du willst doch mit Zahlenwerten arbeiten.

    Was macht die fscanf -Zeile? Welche Bedeutung haben die Parameter?
    Wie oft wird das anzahl_daten++; ausgeführt und welche Auswirkung hat das?



  • anzahl_daten wird so lange um 1 erhöht bis alle zahlen aus der textdatei durchlaufen sind.

    und ja ich verwende einen char array in dem ich die zahlen als zeichen abspeicher dies ermöglicht mir problemlos diese in meiner zu erstellenden Datei einzutragen.



  • In einem char-Array kannst mehrere Zeichen (zusammen) abspeichern.
    Eine Zahl besteht aus mehreren Ziffern/Zeichen.
    Für eine Zahl brauchst du als schon ein char-Array alleine.
    Du versuchst aber eine komplette Zahl/(Teil-)Zeile in einem Zeichen unterzubringen.

    Bei %s liest fscanf bis zu einem Whitespace oder Dateiende.
    Möglicherweise auch die ganze Zeile und nicht nur eine Zahl.

    Annahme:
    In der Datei steht 11,18,12,15, 9,33
    Dann steht in String 19,33
    Dabei ist die 1 von der 11 und die 9,33 vom der zweiten Hälfte.



  • wie kann ich am besten dagegen angehen um diese fehlerhafte Abspeicherung zu unterbinden ?



  • Du musst begreifen, wie scanf funktioniert.
    Geht (IMHO) einfacher ohne Komma.²

    Dann weißt du auch, wie du den Formatstring ändern kannst, damit er das Komma überliest
    Dazu muss man aber die Referenz zu scanf verstehen.
    http://www.cplusplus.com/reference/cstdio/scanf/
    http://en.cppreference.com/w/c/io/fscanf

    Beispiele habe ich genannt.



  • Vielen dank! Konnte mein Problem beheben nun funktioniert alles so wie es sein sollte.



  • Auch mit Leerzeichen vor und/oder nach den Kommas?


Anmelden zum Antworten