• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Ansi C Datei auslesen Zeichensatz problem ?

Talinsei

Cox Orange
Registriert
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 ?
 

Gogul

Uelzener Rambour
Registriert
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
 

BirneX

Idared
Registriert
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
 
Zuletzt bearbeitet:

Talinsei

Cox Orange
Registriert
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++;
}
 

Jamsven

London Pepping
Registriert
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
 

Talinsei

Cox Orange
Registriert
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;

}
 

Talinsei

Cox Orange
Registriert
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;

}


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
 

Jamsven

London Pepping
Registriert
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.
 

Pennywise81

Jonagold
Registriert
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.
 

Jamsven

London Pepping
Registriert
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;
}