- Nvidia GPU-k jövője - amit tudni vélünk
- Dobozos verziót kapnak az IGP nélküli AMD Ryzenek
- 8 kHz-es, jobbkezes PnP egér közeledik a Cherry Xtrfy logójával
- Bemutatta első táblagépét saját neve alatt a HMD
- Megérkezett a Corsair új M.2-es SSD-je, és mindennek mondható, csak lassúnak nem
- iPad topik
- Amazon Kindle
- Érkezik a Crucial LPCAMM2 memóriamodulja
- HiFi műszaki szemmel - sztereó hangrendszerek
- Milyen alaplapot vegyek?
Hirdetés
-
Az ASRock kicsit megnyirbálta az egyik R-DIMM-es alaplapját
ph Az inteles deszka egyebek mellett szakít a Thunderbolt 4-gyel, a Wi-Fi 6E-vel, az egyik übergyors LAN-nal és a fixált I/O pajzzsal.
-
A streamingszolgáltatások összecsomagolása lehet a következő divat
it Ezúttal a Comcast kínálná egyben a Peacock, Netflix és Apple TV+ streamingszolgáltatásokat.
-
Vigor - Alig egy nap múlva PC-n is elérhető lesz a korai kiadás
gp Néhány év késéssel újabb platformra is megkapjuk a játék early access változatát.
Új hozzászólás Aktív témák
-
addikt
Üdv, láncolt listába szeretnék beolvasni fájlból.
Így néz ki a struktúra:
typedef struct Kerdes{
int szint;
char *ker, *a, *b, *c, *d;
char valasz;
struct Kerdes *kov;
} Kerdes;és a függvény:
Kerdes* beolvas(Kerdes *lista){
FILE *fp;
Kerdes *uj;
char c;
uj=(Kerdes*) malloc(sizeof(Kerdes));
lista=(Kerdes*) malloc(sizeof(Kerdes));
char tempk[256], tempa[50], tempb[50], tempc[50], tempd[50];
fp = fopen("loim.txt", "rt");
if (fp == NULL) printf("Nem sikerült megnyitni!");
else{
while(!feof(fp)){
fscanf(fp, "%d %s %s %s %s %s %c\n", &uj->szint, tempk, tempa, tempb, tempc, tempd, &uj->valasz);
uj->ker=(char*) malloc(strlen(tempk)*sizeof(char));
strcpy(lista->ker,tempk);
uj->a=(char*) malloc(strlen(tempa)*sizeof(char));
strcpy(lista->a,tempa);
uj->b=(char*) malloc(strlen(tempb)*sizeof(char));
strcpy(lista->b,tempb);
uj->c=(char*) malloc(strlen(tempc)*sizeof(char));
strcpy(lista->c,tempc);
uj->d=(char*) malloc(strlen(tempd)*sizeof(char));
strcpy(lista->d,tempd);
uj->kov=lista;
lista=uj;
}
}
fclose(fp);
return lista;
}és így hívnám meg main-ben:
Kerdes *lista=NULL;
beolvas(lista);Hiba nélkül lefut, de amint elindul, le is fagy. Mi lehet a gond?
(életem első fájlból olvasása lenne C-ben. korábban csináltam már C#-ban, de ott ugye nem kellett a dinamikus dolgokkal szórakozni. amúgy azt az infót kaptam, hogy ha így elszáll, akkor az pointerek miatt van, de fogalmam sincs hogy hol.)[ Szerkesztve ]
-
addikt
válasz gygabor88 #4262 üzenetére
Tényleg, köszi! Nem is a listaba, hanem az uj-ba kellett volna beolvasnom, meg strcpy-zni aztán onnan meg a lista=uj és akkor elvileg az elejére fűződik.
átírtam az adott részt így:
uj->ker=(char*) malloc((strlen(tempk)+1)*sizeof(char));
lista->ker=(char*) malloc((strlen(tempk)+1)*sizeof(char));
strcpy(uj->ker,tempk);
uj->ker[strlen(tempk)+1]='\0';
uj->a=(char*) malloc((strlen(tempa)+1)*sizeof(char));
lista->a=(char*) malloc((strlen(tempk)+1)*sizeof(char));
strcpy(uj->a,tempa);
stb
.
.és akkor a végére mindig be kéne szúrni a \0-t így?:
uj->ker[strlen(tempk)+1]='\0';Ha jól tudom azért kell NULL-lal hívni, mert akkor az lesz a vége és így tudom bejárni, hogy a nullpointer a kilépési feltétel.
(ja amúgy ugyanúgy lefagy)
[ Szerkesztve ]
-
addikt
válasz gygabor88 #4264 üzenetére
Ezer köszi segítséget!
A túlindexelést egy levlistán olvastam, aztán bele se gondoltam, hogy hülyeség.
..Pont az a baj, hogy nem ismert a stringek hossza, és - bár megadhatnék egy max. hosszt - , a lényeg, hogy egy bájttal se használjak több memóriát, mint amennyi tényleg kell.Kösz a tippet a dubeggerre. Korábban már használtam, de elszoktam tőle, aztán megmutatta, hogy működik a beolvasás, csak nem úgy, ahogy én azt gondoltam.
tempk-ba egy kérdést várnék (legyenönismilliomost írok), amiben ugye több szóköz van, én meg azt hittem, hogy majd kitalálja meddig tart a kérdés. Így utólag elég hülyének érzem magam.
Szóval elkezdte szépen bepakolni a kérdés egyes szavait a válaszok sztringjeibe.
Ezek szerint itt az fscanf nem is használható..? Mindenképpen karakterenként kéne beolvasni?Olyat tudok, hogy karaktert vizsgálni, azon belül meg stringet olvasni?
pl így:while (fgetc(fp) != '9'){ - elvileg a TAB kódja
fscanf(fp, "%s", &tempk);
...+ mindig hozzáfűzögetni az új szavakat;
} -
addikt
válasz skylaner #4269 üzenetére
Köszi, jogos.
Megnéztem egy régebbi példát, és annak mintájára külön függvénnyel fűztem a lista elejére.
Most így néz ki a működő verzió:
...
while(!feof(fp)){
fgets(temp, 256, fp);
sscanf(temp, "%d %[^\t] %[^\t] %[^\t] %[^\t] %[^\t] %c", &szint, &tempk, &tempa, &tempb, &tempc, &tempd, &valasz);
lista=elejere(lista, szint, tempk, tempa, tempb, tempc, tempd, valasz);
}
}
...
Kerdes* elejere(Kerdes *lista, int szint, char* tempk, char* tempa, char* tempb, char* tempc, char* tempd, char valasz){
Kerdes *uj;
uj=(Kerdes*) malloc(sizeof(Kerdes));
uj->szint=szint;
uj->ker=(char*) malloc((strlen(tempk)+1)*sizeof(char));
strcpy(uj->ker,tempk);
uj->a=(char*) malloc((strlen(tempa)+1)*sizeof(char));
strcpy(uj->a,tempa);
uj->b=(char*) malloc((strlen(tempb)+1)*sizeof(char));
strcpy(uj->b,tempb);
uj->c=(char*) malloc((strlen(tempc)+1)*sizeof(char));
strcpy(uj->c,tempc);
uj->d=(char*) malloc((strlen(tempd)+1)*sizeof(char));
strcpy(uj->d,tempd);
uj->valasz=valasz;
uj->kov=lista;
return uj;
}Most fgets-szel beolvasok egy sort, aztán sscanf-fel meg tabulátoronként darabolom és aztán rakom új listaelembe.
A listának meg nem is kellett volna helyet foglalni, mert az csak egy pointer..
Még egyszer kösz a segítséget mindenkinek!
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- BestBuy ruhás topik
- sziku69: Fűzzük össze a szavakat :)
- Székesfehérvár és környéke adok-veszek-beszélgetek
- Kerékpárosok, bringások ide!
- Nvidia GPU-k jövője - amit tudni vélünk
- ASUS routerek
- Escape from Tarkov
- EA Sports WRC '23
- Android alkalmazások - szoftver kibeszélő topik
- Mobil flották
- További aktív témák...
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Promenade Publishing House Kft.
Város: Budapest