Mi lehet az oka annak, hogy az fscanf nem tud beolvasni a fájlomból rendesen?
A rendesen azt jelenti, hogy memóriaszemetet olvas be, a kiírás viszont működik a fájlba, és ugyanolyan formátumot használok, azaz "%s %d", így olvasnék be egy struktúrába (fscanf(fp, "%s %d", head->nev, &head->pont)), de valamiért nem akarja beolvasni.
Mi lehet az oka?
Egy struktúraelem char* típusú mezője.
A pont az gondolom jó, hisz címképző operátor is ott van.
De a vicces az, hogy ez a módszer másnál jól olvas be.
Miben különbözik az általad említett módszer az fscanf-től?
Van benne sortörés.
Most beolvastam azt is: sscanf(line, "%s %d\n", head->nev, &head->pont);
De mindig így néz ki a fájl:
рyѓидU -348520382
p 41
Az utolsó sor az utolsó mentés, azzal nincs baja, de az előzőt mindig így olvassa be, és ilyen rondaság lesz belőle.
Bocsánat, nem akartam rögtön kódsorral bombázni a népet, de akkor írom is :)
Leaderboard *Beolvas()
{
FILE *fp = fopen("leaderboard.txt", "rt");
if (fp != NULL)
{
char line[30];
Leaderboard *head = malloc(sizeof(Leaderboard));
fread(line, sizeof(char), 30, fp);
{
sscanf(line, "%s %d\n", head->nev, &head->pont);
head->elozo = NULL;
head->kov = NULL;
Leaderboard *mozgo = head;
while (!feof(fp))
{
Leaderboard *listaelem = malloc(sizeof(Leaderboard));
fread(line, sizeof(char), 30, fp);
{
sscanf(line, "%s %d\n", listaelem->nev, &listaelem->pont);
listaelem->kov = NULL;
listaelem->elozo = mozgo;
mozgo->kov = listaelem;
mozgo = mozgo->kov;
}
}
fclose(fp);
return head;
}
else
{
perror("An error occured while opening the file.");
return NULL;
}
}
void Mentes(Uint16 *nev, int pont)
{
char* cnev = UintToChar(nev);
FILE *fp = fopen("leaderboard.txt", "wt");
if (fp == NULL)
{
perror("An error occured while opening the file.");
free(cnev);
return;
}
Leaderboard *head;
head = Beolvas();
if (head == NULL)
{
fprintf(fp, "%s %d\n", cnev, pont);
free(cnev);
fclose(fp);
return;
}
Leaderboard *uj = malloc(sizeof(Leaderboard));
Leaderboard *p;
uj->nev = cnev;
uj->pont = pont;
if (head->kov == NULL)
{
uj->kov = NULL;
uj->elozo = head;
head->kov = uj;
}
else
{
p = head;
while (p->kov != NULL && p->pont > pont)
{
p = p->kov;
}
if (p->pont > pont)
{
uj->elozo = p;
uj->kov = p->kov;
p->kov = uj;
}
else
{
uj->elozo = p->elozo;
p->elozo->kov = uj;
uj->kov = p;
p->elozo = uj;
}
}
p = head;
int i = 1;
while (head != NULL && i <= 10)
{
fprintf(fp, "%s %d\n", head->nev, head->pont);
p = head->kov;
free(head);
head = p;
i++;
}
free(cnev);
fclose(fp);
}
A lényeg egyébként: ez egy dicsőséglista lesz egy játékhoz, a játékos nevét, és pontszámát mentem le, de az eddig lementett pontokat beolvasnám, aztán az új adatot a láncolt lista megfelelő helyére teszem attól függően, hogy kinek a pontja magasabb, majd lementem az első 10-et (mert ha eddig volt 10, most már 11 lenne, így az utolsó szépen kishiftelődik a történelembe).
Ennek a megvalósítása szeretett volna lenni ez a kód.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!