Fertiger Quellcode will nicht funktionieren. HILFE !!



  • Guten Tag liebe Community,

    ich habe mich die letzten Tage mit einer Aufgabe befasst in der ich ein Programm schreiben soll das in der Lage ist eine Textdatei, die aus einer Zeile voller Zahlen besteht die untereinander mit einem Komma voneinander getrennt sind, einzulesen und eine neue Textdatei zu erzeugen, die die zuvor eingelesenen Zahlenwerte in einer Tabelle darstellt mit 2 weiteren features wie die Berechnung des Mittelwertes zum dazugehörigen Zahlenwertes und der eingelesenen Stelle, ob der jeweilige Wert an erster Stelle steht usw.

    Mir ist es gelungen das Programm fertig zu programmieren, jedoch habe ich das Problem, dass mein Programm auf Linux nicht funktionieren möchte. Das Programm funktioniert perfekt auf Windows. Könnte mir vllt. bei diesem Problem weiterhelfen ?

    Auf Linux arbeite ich mit Eclipse falls das ein Tipp sein könnte.

    Hier ist mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main () {
    
        int x;
        int i;
        int j;
        int sortierung;
        int anzahl_daten = 0;
    
        FILE *vorgabe;
        FILE *tabelle;
    
        char delimiter[] = ",";
        char *ptr;
    
        char string[200];
        int daten[200];
        int zahlen[200];
        double mittelwert[200];
    
        printf("\t> Willkommen zur Messwerterfassung <\n\n\n");
        printf("Bitte waehlen Sie einen Modus aus.\n");
        printf("(1) Lesen der Textdatei.\n");
        printf("(2) Beenden des Programms.\n\n");
        printf("Eingabe: ");
        scanf("%d",&x);
    
        while(x!=1&&x!=2) {
            printf("\n\nIhre Eingabe ist nicht gueltig, deswegen wiederholen Sie die Eingabe.\n\n");
            printf("Eingabe: ");
            scanf("%d",&x);
        }
        if(x==2) {
            printf("\n\nDas Programm wurde beendet.\n\n");
            return 0;
        }
    
        // 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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
        while (1 == fscanf(vorgabe,"%s",&string[anzahl_daten]) && 1) {//die letzte 1 durch Test auf Arrayüberlauf ersetzen
    
            anzahl_daten++;
        }
    
        ptr = strtok(string, delimiter);
        i=0;
    
        while(ptr != NULL) { //Bildung von Abschnitten der einzelnen Zahlen als Zeichenketten
            // naechsten Abschnitt erstellen
            ptr = strtok(NULL, delimiter);
            daten[i]=ptr;
            ++i;
        }
    
        //EINLESEN ENDE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    
        for(i=0;i<36;i++) { //Umwandlung der zeichenketten zu Integar-werten
    
            zahlen[i] = atoi(daten[i]);
        }
    
        //Sortierung der eingelesenen Werte
            for(i=0; i<37; i++){ //Zahlen aufsteigend sortieren
                for(j=0; j<=35; j++){
                        if(zahlen[j+1]<=zahlen[j]) {
                                sortierung=zahlen[j+1];
                                zahlen[j+1]=zahlen[j];
                                    zahlen[j]= sortierung;
                        }
                }
        }
    
        for(i=0;i<37;i++) {
            mittelwert[i] = ((double)zahlen[i]/2);
        }
    
        //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++) {
            fprintf(tabelle,"%d\t\t%d\t\t%.2lf\t\t%d\n",i,zahlen[i],mittelwert[i] ,i);
        }
    
        printf("Die Tabelle mit den erzeugten Dateien wurde erfolgreich erstellt.\n\n");
    
        // Datei schliessen
        fclose(vorgabe);
        fclose(tabelle);
    
    return 0;
    
    }
    


  • Was heisst "funktioniert nicht"?

    if(vorgabe == NULL) {
            printf("\n\nDie Datei konnte NICHT geoeffnet werden.\n");
        }else {
            printf("\n\nDie Datei konnte geoeffnet werden.\n\n\n");
        }
    

    Wenn die Datei nicht geoffnet werden kann reicht es nicht eine Meldung auszugeben und dann einfach weiterzumachen... Tu da mal ein return 1 rein, dann wird das Programm abgebrochen.



  • hmmm strtok braucht meine ich string.h

    ansonsten stellt sich die frage, was genau denn nicht funktioniert.
    ich hab zwar versucht, meine glaskugel zu befragen, aber dann ist sie mir runter gefallen und kaputt gegangen. 😡



  • Warnungen aktivieren!!! string.h fehlt für strtok() und irgendwas stimmt da nicht:

    f.c:77:10: warning: assignment makes integer from pointer without a cast [enabled by default]
    f.c:86:2: warning: passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default]
    


  • Ja du hast recht. Danke.

    Also mein Programm erstellt auf Linux mit Eclipse keine Datei.
    Auf Windows wird mit dem selben Code eine Datei erstellt mit der verlangten Tabelle.

    Ich weiß nicht genau, ob es an Linux liegen könnte oder vllt. an Eclipse und wie ich dieses Problem beheben könnte. Die Bedingung dieser Aufgabe ist, dass ich diese auf Linux vorstellen muss.



  • Möchtest du noch einen Tipp geben, wie sich das Verhalten zwischen Linux und Windows unterscheidet?

    Ich hatte es schon in einem deiner letzten Threads erwähnt, dass es Blödsinn ist, nur eine Meldung auszugeben, wenn die Datei nicht geöffnet werden kann.
    Da gehört noch mehr dazu.
    (Das ist so, als wenn sich die Fahrstuhltür öffnet, du sagst: "Es ist kein Fahrstuhl da", aber trotzdem nach vorn (in den Schacht) gehst.)

    Du kannst den Debugger nehmen oder ein paar mehr printf einbauen, damit du siehst, wo es klemmt.
    Auch perror ist dabei sehr hilfreich: http://www.cplusplus.com/reference/cstdio/perror/?kw=perror



  • Ok, zu spät.

    Auch das fopen für "mittelwerte_M_N.txt" muss eine Erfolgskontrolle bekommen.
    Mit perror bekommst du auch winen Hinweis, was schief gegangen ist.



  • Es wird die zu Beginn eine kleine Spielerei abgefragt, ob man eine Datei einlesen möchte oder nicht. drückt man eine 1 dann und es wird die Vorgabedatei eingelesen.
    Anschließend wird in der Konsole ein kleiner text ausgegeben, dass quasi alles ok war. Im Ordner wo sich die Textdatei befindet wird dann unter Windows eine neue Textdatei erzeugt. Das selbe Schema läuft auch bei Linux ab nur, dass keine Textdatei erzeugt wird.

    Ich habe es bereits mit ein paar ausgaben versucht, ob vllt wegen Eclipse oder wegen Linux in eine Schleife nicht reingegangen wird, aber alle Ausgaben wurde in der Konsole ausgegeben. Somit liegt es wohl nicht an der Logik des Programmablaufs würde ich nun mal so behaupten.



  • Habe es soeben mit "perror" gemacht und wie zuvor kam die Ausgabe, dass es erfolgreich war ("success").



  • Ich habe es eben verwechselt mit dem perror und an einer falschen Stelle geschrieben, wo die Vorgabedatei eingelesen wird.

    Ich habe es nun an der Stelle wo die Datei erzeugt werden sollte, aber es kam nichts.

    //Datei schreiben und befüllen mit fprintf
        tabelle = fopen("mittelwerte_M_N.txt","w+");
    
        if(tabelle==NULL) {
        perror("klappt");
        } else {
        perror("klappt nicht");
        }
    


  • Hast du es aus der IDE gestartet?
    Wenn ja öffne mal die Kommandozeile, wechsel zum desktop und starte das Programm dort.



  • Was soll IDE sein ?

    Ich habe es jetzt gerade über einen Konsolenaufruf versucht und das programm so gestartet und das wurde mir angezeigt.

    > Willkommen zur Messwerterfassung <

    Bitte waehlen Sie einen Modus aus.
    (1) Lesen der Textdatei.
    (2) Beenden des Programms.

    Eingabe: 1

    Die Datei konnte geoeffnet werden.

    Speicherzugriffsfehler (Speicherabzug geschrieben)
    student@student-virtual-machine:~/Arbeitsfläche$



  • Nicht übersehen: Beitrag vom 14:14:06 11.01.2016
    Irgendwas stimmt da nicht, Warnungen an!



  • Was soll Zeile 66?
    Die Schleife wird sowieso nur einmal ausgeführt, sofern keine Leerzeichen oder Umbrüche in der Datei sind.

    Ausserdem kommt es dort zu einem Überlauf wenn die Daten nicht in das Array passen.

    IDE: integrated development environment



  • Bitmapper schrieb:

    Was soll Zeile 66?
    Die Schleife wird sowieso nur einmal ausgeführt, sofern keine Leerzeichen oder Umbrüche in der Datei sind.

    Ausserdem kommt es dort zu einem Überlauf wenn die Daten nicht in das Array passen.

    Cobain hat scanf nicht verstanden, wollte es unbedingt mit strtok machen und hat solange rumgespielt bis das Ergebnis stimmte.
    Er hat nicht verstanden was und warum es passiert.

    Das sieht man auch daran, dass er zählt, wie oft strtok läuft, danach aber wieder mit festen Werten arbeitet



  • Cobain schrieb:

    Was soll IDE sein ?

    Ich habe es jetzt gerade über einen Konsolenaufruf versucht und das programm so gestartet und das wurde mir angezeigt.

    > Willkommen zur Messwerterfassung <

    Bitte waehlen Sie einen Modus aus.
    (1) Lesen der Textdatei.
    (2) Beenden des Programms.

    Eingabe: 1

    Die Datei konnte geoeffnet werden.

    Speicherzugriffsfehler (Speicherabzug geschrieben)
    student@student-virtual-machine:~/Arbeitsfläche$

    Machst du zwischen "Die Datei konnte geoeffnet werden." und "Die Tabelle mit den erzeugten Dateien wurde erfolgreich erstellt." noch irgendwelche anderen Ausgaben?
    Z.B. in
    Zeile 70: puts("Fertig mit einlesen");
    Zeile 75: printf("Token gefunden <%s>\n", ptr);
    Zeile 82: puts("EINLESEN ENDE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    usw.



  • Ich weise nochmal auf die Warnungen hin... atoi() wird mit einem Integer aufgerufen, dass das nicht passen kann sieht man doch schon am Funktionsnamen.


Anmelden zum Antworten