Jeg får grå hår - struct og fil-skrivning
Jeg er rådvild... hvad pokker sker der her. Jeg har i en struct defineret en char name[15] som jeg naturligvis skal have et navn i. Når jeg benytter nedestående funktioner, bliver der dog af en eller anden grund fyldt mere end 15 pladser i name-arrayet. Den fylder fint et evt. navn ind, men laver i samme øjeblik to underlige tegn på name[15] og name[16].Hvad har den gang i og hvordan får jeg den til at opføre sig ordentligt? Det virkede for 3 sekunder siden og lige pludselig... Min umiddelbare fornemmelse er at der bliver skrevet et eller andet ekstra linie-skift ind....
Jeg har lavet en header med en struct:
struct hs_element {
char name[15];
int score;
int colors;
int pins;
int max_guesses;
};
funktionen der starter det hele ser således ud:
void play_game(void) {
int m=0, p=0, i=0, guesses_used=0, points=0;
outcome guess;
char code_array[N_DEF+1];
struct hs_element hs_member;
for (i=0; i<N_DEF; i++) /* Array initialiseres */
code_array[i] = ' ';
srand(time(NULL));
set_options(&m,&p);
generate_computer_code(code_array,m);
do guess = evaluate_guess(code_array,p,&guesses_used);
while (guess == proceed);
switch (guess){
case win:
prn_win();
points = (N_DEF * m * (20-guesses_used) + (21-p));
if (check_for_hs_placement(points) == 1) { /* Der tjekkes om spilleren kommer på highscore */
hs_member = make_hs_member_struct(m,p,points); /* Der laves en struct med oplysninger til highscore */
write_to_highscore(&hs_member); /* structen skrives til highscore-fil */
}
De 2 vigtige funktioner (tror jeg):
struct hs_element make_hs_member_struct(int m, int p, int points) {
struct hs_element hs_member;
int i=0;
char c;
printf("Please write your firstname for the highscore: "); /* spillerens navn indlæses */
if (c = getchar() == '\n'); /* Denne linie "snupper" et ENTER der "hænger". Nødløsning(virker) */
for (i=0; i<15; i++){ /* Array tømmes */
hs_member.name[i] = ' ';
}
for (i=0; ((c = getchar()) != '\n'); i++) /* indlæser navnet i struct.name */
hs_member.name[i] = c;
hs_member.score = points;
hs_member.colors = m;
hs_member.pins = N_DEF;
hs_member.max_guesses = p;
return hs_member;
}
void write_to_highscore(struct hs_element *hs_member_pnt) {
FILE *fp;
struct hs_element tmp, hs_list[10]; /* array af structs */
int i=0, j=0, max=0;
char c;
tmp = *hs_member_pnt;
printf("tmp.navn er:%s!!!", tmp.name);
max = get_pos_in_hs();
fp = fopen("Highscore_file.txt","r"); /* Vi åbner først filen til læsning */
if (max != 0){
for (i=0; i<max; i++){ /* vi indlæser den eksisterende hs-liste */
fscanf(fp,"%[^,],%d,%d,%d,%d,%c",hs_list[i].name,&hs_list[i].score,&hs_list[i].colors,&hs_list[i].pins,&hs_list[i].max_guesses,&c);
}
for (i=0; i<max; i++){
if (tmp.score > hs_list[i].score){
j = i;
i = max;
while (i>j) { /* vi rykker lavere score's ned af highscore listen. Bemærk - gøres baglæns. */
hs_list[i] = hs_list[i-1];
--i;
}
hs_list[j] = tmp; /* indsætter den nye highscore placering. */
break;
}
}
}
else {
hs_list[i] = tmp;
}
fclose(fp);
fp = fopen("Highscore_file.txt","w"); /* Vi åbner nu filen til (over-)skrivning */
for (i=0; i<=max; i++) {
fprintf(fp, "%s,", hs_list[i].name);
fprintf(fp, "%d,", hs_list[i].score);
fprintf(fp, "%d,", hs_list[i].colors);
fprintf(fp, "%d,", hs_list[i].pins);
fprintf(fp, "%d,", hs_list[i].max_guesses);
fprintf(fp, "\n");
}
fclose(fp);
}