Öffnen und Erzeugung einer Textdatei in C



  • messzeitpunkt wird einfach mit i pro zeile um 1 erhöht bis alle werte durchlaufen sind. es sind in einer datei 37 werte gegeben und darauf bezieht sich i. mein problem ist es grad nur die dateien in der vorgabedatei mit den zahlen abzuspeichern um sie in der neuen textdatei einzubinden. dabei wird auch der mittelwert ausgegeben der immer mit dem vorherigen wert addiert wird und dann durch 2 geteilt wird.



  • Wenn du die Werte einzeln verarbeitest, brauchst du kein Array.
    Du kannst einen Wert einlesen, verarbeiten und ausgeben.
    Das in einer Schleife, bis alle Daten gelesen sind.

    Du kannst deine Vorgabedatei erstmal ohne Komma (nur Leerzeichen als Trenner) abspeichern.
    Das macht das am Anfang leichter.



  • das problem ist, dass es die bedingung der aufgabe ist die werte genau so auszulesen



  • Schritt für Schritt.
    Die Erweiterung um das Komma zu überlesen, kannst du dann immer noch einbauen, wenn du weißt, dass der Rest funktioniert.



  • ich versuche mich ganze zeit dran aber schaffe es nicht. ich bekomme die werte die ich lese nicht in einem array. ich wollte es mit einem array machen da es direkt übersichtlicher ist meiner meinung nach für die ausgabe und fürs rechnen



  • 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.


Anmelden zum Antworten