Kezdőoldal » Számítástechnika » Programozás » Mi lehet az oka annak, hogy...

Mi lehet az oka annak, hogy az fscanf nem tud beolvasni a fájlomból rendesen?

Figyelt kérdés

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?



2017. nov. 24. 09:40
1 2
 1/11 anonim ***** válasza:
Én a helyedbe egy fread-el beolvasnék egy sort egy stringbe és azt utána sscanf-el betenném a struktúrába.
2017. nov. 24. 09:52
Hasznos számodra ez a válasz?
 2/11 anonim ***** válasza:
Remélem azt tudod, hogy a paraméterekben memóriacímeket kell megadni, nem tudom, hogy a head->nev mögött mi van.
2017. nov. 24. 10:14
Hasznos számodra ez a válasz?
 3/11 A kérdező kommentje:

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?

2017. nov. 24. 10:28
 4/11 A kérdező kommentje:
De egyébként kipróbáltam, és így sem tudja beolvasni jól.
2017. nov. 24. 11:33
 5/11 anonim ***** válasza:
Sortörés nincs véletlenül a fájlban? Mert akkor azt is be kell olvasnod.
2017. nov. 24. 12:36
Hasznos számodra ez a válasz?
 6/11 A kérdező kommentje:

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.

2017. nov. 24. 12:46
 7/11 anonim ***** válasza:
Egyébként jó lenne ha mondjuk minden releváns infót megadnál, hogy lássuk is mi van. Beolvasást végző kód, kiírást végző kód, fájl minta...
2017. nov. 24. 13:51
Hasznos számodra ez a válasz?
 8/11 A kérdező kommentje:

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.

2017. nov. 24. 14:38
 9/11 A kérdező kommentje:
Ja még valami: láttok ott egy UintToChar függvényhívást, amiatt nem kell aggódni, az működik, mert azt az egy sort, amit szépen tud kiírni, azt jól írja ki.
2017. nov. 24. 14:40
 10/11 sharkxxx ***** válasza:
2017. nov. 24. 17:09
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!