fscanf und speicherzugriffsfehler
-
halli hallo,
für die uni muss ich ein kleines programm schreiben, habe alle funktionen fertig bis auf eine kleine sache. die ich einfach nicht peile:
ich habe eine datei die sieht beispielsweise so aus:
"
wakabayashi 123.00000
tsubasa 5.30000
mario 0.64564
"
und ich will namen und die dahinterstehenden werte in arrays ablegen.
momentan hab ich das so gebastelt, dass die floats zu je 2 ints gelesen werden später bastel ich die wieder zusammen(oder ich schreibs auf einen float um , wenns dann läuft).mein problem ist ich bekomme speicherzugriffsfehler beim auslesen der werte.
habe die schleife bereits rausgenommen und erhalte den fehler schon beim auslesen der ersten zeile.Am ende wohlgemerkt, die erste zeile gibt er noch aus.habe auch schon mit fgets und was darauf zu folgen hat, rumprobiert. Komme aber nicht auf einen grünen zweig. solangsam steht zeit und hausaufgabenpunkte auch in keinem verhältniss mehr.
Also bitte helft mir:
Wieso erhalte ich die speicherzugriffsfehler?
meine vermutung ist:"der zeiger tanzt".#include<stdio.h>
#include<stdlib.h>int main (void)
{
system("clear");printf("\n\nTEST\n\n");
FILE *fp1;
char parameter[4];
int wert1[4];
int wert2[4];
int i;fp1 = fopen ("spieler.dat", "r");
if (fp1 != NULL){i=0;
do{
parameter[i]='t';
wert1[i]=0;
wert2[i]=0;
i=i+1;
}while(i!=4);i=0;
do{
fscanf(fp1,"%s %i.%i \n" ,¶meter[i], &wert1[i],&wert2[i]);
printf("%-30s \n %i.%i \n ", ¶meter[i], wert1[i],wert2[i]);
i++;
}while(i<1);
}
fclose(fp1);
return 0;
}Bitte helft mir!
Und bitte versucht mir nicht das fischen beizubringen, ich bin zu verzwifelt dafür. habe mich auch wirklich viel damit beschäftigt im vorhinein.gruss huppi
-
Ein char ist der Datentyp für einzelne Buchstaben. Für eine Buchstabenfolge nimmt man gewöhnlicherweise Arrays von chars. Google mal nach "C String", da dürftest du genügend Anleitungen finden (wenn du die gleichnamige Unterwäsche ignorierst).
-
Erstmal vielen dank für die antwort und das umn die uhrzeit.
ich war der meinung, dass bei c char und string "das gleiche" ist.
immerhin nutz ich char ja auch zur dateneingabe.
ich will wirklich nur noch diese funktion fertig bekommen und habe schon viel recherchiert(10h min.), danch brauch ich c nie wieder.
bin da viel eher an c# interessiert.Gib einem Mann einen Fisch und er hat Nahrung für einen Tag, bring einem Mann das Fischen bei und er hat Nahrung für sein ganzes Leben.
ich will den fisch. bitte bitte
-
Wer nicht das Fischen lernen will, wird immer im trüben fischen.
Ich weiß nicht recht, was Du machen willst, aber probier mal bei scanf:
fscanf(fp1,"%c %i.%i \n" ,¶meter[i], &wert1[i],&wert2[i]);
%c ließt nur ein einzeles Char-Zeichen in den Char-Puffer.
-
Ich möchte die namen hinterlegen und die werte noch zusätzlich verarbeiten(als float), die ich aus der datei eingelesen habe.
-->das einlesen führt zu einem Speicherzugrifsfehlerbrauche aber die kompletten namen und nicht lediglich einen char aus dem namen.
-
Dann darft Du aber nicht ¶meter[i] schreiben, sondern nur parameter und %s stimmt. Der String in der Datei muß Null-terminiert sein und der Puffer für den String muß groß genug sein. In Deinem Fall würde das bedeuten der Name dürfte nur vier Buchstaben haben.
die Schleife:i=0; do { fscanf(fp1,"%s %i.%i \n" ,parameter, &wert1[i],&wert2[i]); printf("%-30s \n %i.%i \n ", parameter, wert1[i],wert2[i]); i++; }while(i<1);
wird nur einmal ausgeführt.
-
char parameter[4]
definiert ein Feld/Array mit Platz für 4 char.
Du brauchst aber 4 charARRAYs oder auch string genannt, wobei es in ANSI C den Typ string nicht gibt. Meist wird dieser mit char* oder char[] definiert.Der u.g. Code wertet nur Zeilen mit dem von dir beispielhaft genannten Format aus und macht auch gleich doubles daraus.
int main() { FILE *fp1; char zeile[80],parameter[4][100]={"","","",""}; double wert[4]={0,0,0,0}; int i=0; fp1 = fopen ("spieler.dat", "rt"); if( !fp1 ) return EXIT_FAILURE; while( fgets(zeile,sizeof zeile,fp1) ) if( i<4 && 2==sscanf(zeile,"%99[^ ]%lf",parameter[i],&wert[i]) ) printf("%-30s\n %lf\n",parameter[i],wert[i]),++i; fclose(fp1); return EXIT_SUCCESS; }
Zum Üben könntest zu ja mal versuchen, den Code für eine variable Größe (statt 4) umzubauen.
-
danke werde mal einen puffer erstellen und das damit versuchen,
einaml durchlaufen war für testzwecke so eingestellt.
werde ab 13 uhr zum raport wieder hier sein.
-
aber pünktlich zum Raport bitte...
Hast Du immer nur vier Datensätze in deiner Datei? Wenn die Zahl der Datensätze variabel ist, dann mußt Du den Speicher dynamisch allokieren; dann wird's erst richtig lustig...
-
Hab es jetzt so gelöst, dass ich einfach alle werte eingelesen habe ohne die nicht existente "string-arrays" zu nutzen. Danke für die Antworten.
bis bald in c#.
euer huppi
-
huppifluppi schrieb:
bis bald in c#.
euer huppiwaahaas??!!