1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

Ansi C Datei auslesen Zeichensatz problem ?

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Talinsei, 24.11.09.

  1. Talinsei

    Talinsei Cox Orange

    Dabei seit:
    01.09.09
    Beiträge:
    98
    Hallo, habe eine datei bekommen :

    sort.dat

    mit folgenden Werten :

    4
    20
    12
    8
    16
    6
    10
    14
    2
    18
    -3
    21
    0


    jetzt lese ich sie mit folgendem Code ein :


    #include <stdlib.h>
    #include <stdio.h>


    int main() {
    FILE *datei;
    const int ANZAHL = 20, LAENGE=3;
    char line[ANZAHL][LAENGE];
    int num[ANZAHL];
    int i;
    datei = fopen ("sort.dat","r");
    if (datei != NULL)
    {
    for(i = 0; i < ANZAHL;i++) {
    fgets(line,LAENGE,datei); //zeilen weise lesen mit fgets...
    num = atoi(line);
    printf ("%i) %d (%s)\n",i ,num, line);
    }

    }
    fclose (datei);
    return 0;
    }


    und bekomme


    0) 0 (fo)
    1) 0 (pe)
    2) 0 (n )
    3) 0 (ex)
    4) 0 (am)
    5) 0 (pl)
    6) 0 (e )
    7) 0 (%c)
    8) 0 ( )
    9) 0 (_?)
    10) 0 ()
    11) 0 ()
    12) 0 ()
    13) 0 ()
    14) 0 (?_?)
    15) 0 ()
    16) 0 ()
    17) 0 ()
    18) 0 ()
    19) 0 ()
    raus. Bei nem Freund mit nem Windows pc klappt das. Jemand ne ahnung warum bei mir son zeugs rauskommt ?
     
  2. Gogul

    Gogul Uelzener Rambour

    Dabei seit:
    21.05.04
    Beiträge:
    372
    Hi!

    imho ist
    Code:
    const int ANZAHL = 20, LAENGE=3;
    char line[ANZAHL][LAENGE];
    int num[ANZAHL];
    
    nicht erlaubt, da die größer von arrays vor der Compilierung feststehen muss, also zb mit #define ANZAHL 20 machen.

    Dann liest fgets auch das zeilenumbruchzeichen ("\n") mit ein, das heist LAENGE muss mindestens 4 sein (zb. steht im speicher: 12\n\0). Das \n muss du dann denk ich noch entfernen, da atoi damit nicht zurecht kommt
     
  3. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
  4. BirneX

    BirneX Idared

    Dabei seit:
    20.03.09
    Beiträge:
    29
    Ohne jetzt den Quellcode irgendwie kommentieren zu wollen, bei mir (OS-X-Snow Leopard, gcc 4.2.1) funktioniert das Beispiel, bzw. gibt das aus, was es auch ausgeben sollte bzw, was eingelesen wurde.

    BirneX
     
    #4 BirneX, 25.11.09
    Zuletzt bearbeitet: 25.11.09
  5. Talinsei

    Talinsei Cox Orange

    Dabei seit:
    01.09.09
    Beiträge:
    98
    Habe den kompletten Pfad angegeben, damit klappt es soweit ganz gut. Hab noch eine andere Frage, muss einen "simpel" Sortiervorgang programmieren.

    Bsp :

    12 2 9 8 4
    2 12 9 8 4
    2 4 9 8 12

    habe dazu mal was programmiert, allerdings funktioniert das nur in den ersten zwei durchläufen. Ich hab sau viel probiert, findet da jemand einen Fehler ?

    int position;
    int buffer;
    int zahl=num[0]; // num[0] = erste Stelle des Daten arrys
    int durchlauf = 0;


    while(durchlauf<i) { // Anzahl der Datensätze

    for(int j=0;j<ANZAHL;j++) { // Anzahl = Länge des Arrays
    if(zahl>num[j+1]) {
    zahl=num[j+1];
    position = j+1;
    }
    }
    buffer = num[durchlauf]; num[durchlauf] = zahl; num[position] = buffer; zahl=durchlauf+1;

    int p=0;
    printf("\n");
    for(p=0;p<i;p++) {
    printf(" %i ",num[p]);
    }


    durchlauf++;
    }
     
  6. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Schau dir mal den wikipedia Pseudocode für Bubblesort an:
    Code:
    prozedur bubbleSort( A : Liste sortierbarer Elemente ) 
      n := Länge( A )
      wiederhole
        vertauscht := falsch
        für jedes i von 1 bis n - 1 wiederhole 
          falls A[ i ] > A[ i + 1 ] dann
            vertausche( A[ i ], A[ i + 1 ] )
            vertauscht := wahr
          ende falls
        ende für
        n := n - 1
      solange vertauscht und n >= 1
    prozedur ende
     
  7. Talinsei

    Talinsei Cox Orange

    Dabei seit:
    01.09.09
    Beiträge:
    98
    Ja, Bubbleshort sollen wir nicht implementieren, sondern nur diesen "billigen" suchalgorithmus. Ich habs fast geschafft, allerdings hab ich ab dem 7. Durchgang falsche Werte raus. Jemand eine idee warum mein Ansatz nur 7 mal funktioniert und dann nichtmehr ?


    Hier die Datei :

    4
    20
    12
    8
    16
    6
    10
    14
    2
    18
    -3
    21
    0



    #include <stdlib.h>
    #include <stdio.h>


    int main() {
    FILE *datei;
    const int ANZAHL = 20, LAENGE=5;
    char line[ANZAHL][LAENGE];
    int num[ANZAHL];
    int i;
    datei = fopen ("/Users/Tim/Documents/Praktikum 6/sort.dat","r+");
    if (datei != NULL)
    {
    while (!feof(datei)) {


    fgets(line,LAENGE,datei);

    num = atoi(line);

    printf ("%i ",num);
    i++;

    }



    } else {printf("Öffnen Fehlgeschlagen");}


    int position = 0;
    int zahl = 0;
    int durchlaufe = 0;
    int j=0;
    int buffer=0;

    while(durchlaufe<i) {
    printf("Durchlaufnummer : %i\n", durchlaufe);
    zahl = num[durchlaufe];

    for(j=durchlaufe;j<=i;j++) {
    if(zahl>num[j+1]) {
    zahl=num[j+1];
    position=j+1;
    }
    }

    buffer = num[durchlaufe];
    num[durchlaufe] = zahl;
    num[position]=buffer;
    durchlaufe++;

    for(int g=0;g<i;g++) {
    printf(" %i ", num[g]);





    }
    }








    fclose (datei);

    return 0;

    }
     
  8. Talinsei

    Talinsei Cox Orange

    Dabei seit:
    01.09.09
    Beiträge:
    98


    Ausgabe :

    4 20 12 8 16 6 10 14 2 18 -3 21 0 Durchlaufnummer : 0
    -3 20 12 8 16 6 10 14 2 18 4 21 0 Durchlaufnummer : 1
    -3 0 12 8 16 6 10 14 2 18 4 21 20 Durchlaufnummer : 2
    -3 0 2 8 16 6 10 14 12 18 4 21 20 Durchlaufnummer : 3
    -3 0 2 4 16 6 10 14 12 18 8 21 20 Durchlaufnummer : 4
    -3 0 2 4 6 16 10 14 12 18 8 21 20 Durchlaufnummer : 5
    -3 0 2 4 6 8 10 14 12 18 16 21 20 Durchlaufnummer : 6
    -3 0 2 4 6 8 10 14 12 18 10 21 20 Durchlaufnummer : 7
    -3 0 2 4 6 8 10 10 12 18 14 21 20 Durchlaufnummer : 8
    -3 0 2 4 6 8 10 10 12 18 12 21 20 Durchlaufnummer : 9
    -3 0 2 4 6 8 10 10 12 12 18 21 20 Durchlaufnummer : 10
    -3 0 2 4 6 8 10 10 12 12 18 21 20 Durchlaufnummer : 11
    -3 0 2 4 6 8 10 10 12 12 18 20 21 Durchlaufnummer : 12
    -3 0 2 4 6 8 10 10 12 12 18 20 21 logout
     
  9. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Hmm also imho versuchst du bubblesort zu schreiben. Übrigens ist eigentlich nur noch bogo-sort der schlechtere Algorithmus.
     
  10. Pennywise81

    Pennywise81 Jonagold

    Dabei seit:
    23.07.09
    Beiträge:
    21
    Es gibt zwei Stellen, die fehlerhaft bis problematisch sind:

    1. Kritischer Fehler in der for-Schleife:
    Code:
    for(j=durchlaufe;j<=i;j++) {
        if(zahl>num[j+1]) {
            zahl=num[j+1];
            position=j+1;
        }
    }
    
    Nehmen wir mal, dass die Datei 20 Zahlen beinhaltet, dann kommt es an dieser Stelle zu einem Überlauf, da im Verlauf der Schleife auf das 22. Element des Arrays (mit Index 21) zugegriffen wird. Das Array hat aber nur 20 Elemente.

    Es wäre also besser/sicherer die for-Schleife ein wenig anders zu definieren:
    Code:
    for(j=(durchlaufe+1);j < i; j++) {
        if(zahl>num[j]) {
            zahl=num[j];
            position=j;
        }
    }
    
    2. Fehler im Ergebnis
    Der Fehler in deinem Ergebnis kommt allerdings später dadurch zustande, weil die Variable position immer den Wert beinhaltet, der in der oben genannten if-Bedingung gesetzt wird. Selbst wenn es keine kleinere Zahl gibt als die aktuelle Zahl (an Position durchlaufe), wird die Zahl mit der letzten Position getauscht.
    Wenn man vor der for-Schleife die position auf durchlaufe setzt, sollte sich das Problem erledigen.
     
  11. Jamsven

    Jamsven London Pepping

    Dabei seit:
    21.11.07
    Beiträge:
    2.046
    Code:
    #include <stdio.h>
    
    #define ARRAYLENGTH 10
    #define TRUE 1
    #define FALSE 0
    #define BOOLEAN int
    
    void bubbleSort(int array[ARRAYLENGTH])
    {
    	BOOLEAN ischanged;
    	int i, tmp, length=ARRAYLENGTH;
    	do
    	{
    		ischanged=FALSE;
    		for(i=0;i<length-1;i++)
    		{
    			if(array[i]>array[i+1])
    			{
    				tmp=array[i];
    				array[i]=array[i+1];;
    				array[i+1]=tmp;
    				ischanged=TRUE;
    			}
    		}
    		length--;
    	}
    	while(ischanged&&length>=1);
    		
    }
    
    int main()
    {
    	int array[ARRAYLENGTH]={9,8,7,6,5,4,3,2,1,0};
    	int i;
    	bubbleSort(array);
    	for(i=0;i<ARRAYLENGTH;i++)
    		printf("%d ",array[i]);
    		printf("\n");
    	return 0;
    }
     

Diese Seite empfehlen