Afisare fisier
#1
Posted 13 January 2018 - 19:36
BUNA ZIUA AM ACEST COD SI IN PRINCIPIU DORESC SA MI SE AFISEZE FISIERUL FOLOSIND STRUCTURI, AM ALES ACEASTA VARIANTA DEOARECE MA VA AJUTA MAI MULT MAI DEPARTE, IN CELELALTE SUBPUNCTE .EU AICI VREAU SA IMI PRELUCREZ TEXTUL SI SA SCAP DE # #
ID_carte Nume_carte Numar_pagini Editura Cereri Imprumutata #1# #Jurnalul unui pusti# #20# #Humanitas# #20# #DA# #2# #Crima si pedeapsa# #350# #Humanitas# #5# #NU# #3# #Dune# #220# #Nemira# #1# #DA# #4# #Fundatia# #120# #Nemira# #10# #DA# #5# #1984# #243# #Penguin Books# #123# #NU# #6# #Prelucrarea numerica a semnalelor# #223# #Editura ATM# #2# #NU# #7# #Idiotul# #150# #Humanitas# #20# #NU# #8# #Programarea calculatorelor# #100# #Editura ATM# #234# #DA# #10# #Programarea calculatorelor# #100# #Editura ATM# #234# #DA# #8# #Programarea calculatorelor# #100# #Editura ATM# #234# #DA# #10# #Programarea calculatorelor# #100# #Editura ATM# #234# #NU# ASA ARATA FISIERUL #include <stdio.h> #include <stdlib.h> #include <string.h> struct linie{ int ID_carte; char Nume_carte[100]; int Numar_pagini; char Editura[100]; int Cereri; char Imprumutata[100]; }l[20]; int n; void continut_fisier(struct linie l[20]); void main () { continut_fisier(l); } void continut_fisier(struct linie l[20]) { FILE *fin=fopen("biblioteca.txt","r"); int i=0,k=0; char lin[500],*p; if(fin==NULL) printf("EROARE DESCHIDERE FISIER"); while(!feof(fin)) { fgets(lin,500,fin); p=strtok(lin,"# #"); l[i].ID_carte=atoi(p); p=strtok(NULL,"# #"); strcpy(l[i].Nume_carte,p); p=strtok(NULL,"# #"); l[i].Numar_pagini=atoi(p); p=strtok(NULL,"# #"); strcpy(l[i].Editura,p); p=strtok(NULL,"# #"); l[i].Cereri=atoi(p); p=strtok(NULL,"# #"); strcpy(l[i].Imprumutata,p); i++; } for(k=1;k<i;k++) printf("%d %s %d %s %d %s\n",l[k].ID_carte,l[k].Nume_carte,l[k].Numar_pagini,l[k].Editura,l[k].Cereri,l[k].Imprumutata); } NU STIU DE CE ATUNCI CAND VREAU SA IMI FIE STOCAT NUMELE CARTII DUPA SPATIU SARE LA NUMARUL DE PAGINI. AS VREA SA STIU UNDE AM GRESIT Edited by geomihai00, 13 January 2018 - 19:38. |
#2
Posted 13 January 2018 - 19:50
Nu inteleg ce vrei sa spui dar mai citeste o data, cu mare atentie, definitia functiei strtok(). Mai precis vezi la ce foloseste al doilea argument. Nu e deloc asa cum cred ca crezi tu…
|
#3
Posted 13 January 2018 - 21:11
stiu ce face strtok doar ca voiam sa zic ca atunci cand ajunge cursorul la al 3 # si doream sa copiez ce e intre al 3 si al 4 # mi se oprea dupa primu spatiu
Edited by geomihai00, 13 January 2018 - 21:11. |
#4
Posted 13 January 2018 - 21:30
strtok(), asa cum il apelezi tu, nu trebuie sa se opreasca [si] dupa primul spatiu? Mai citeste, CU ATENTIE, documentatia pentru aceasta functie.
|
#5
Posted 13 January 2018 - 22:07
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> struct linie { int ID_carte; char Nume_carte[100]; int Numar_pagini; char Editura[100]; int Cereri; char Imprumutata[100]; }l[500]; void continut_fisier(struct linie l[500]); void main() { continut_fisier(l); } void continut_fisier(struct linie l[500]) { FILE *fin = fopen("biblioteca.txt", "r"); int i = 0, k = 0; char lin[500], *p; if (fin == NULL) printf("EROARE DESCHIDERE FISIER"); while (!feof(fin)) { fgets(lin, 500, fin); p = strtok(lin, "#"); l[i].ID_carte = atoi(p); p = strtok(NULL, "#"); p = strtok(NULL, "#"); strcpy(l[i].Nume_carte, p); p = strtok(NULL, "#"); p = strtok(NULL, "#"); l[i].Numar_pagini = atoi(p); p = strtok(NULL, "#"); p = strtok(NULL, "#"); strcpy(l[i].Editura, p); p = strtok(NULL, "#"); p = strtok(NULL, "#"); l[i].Cereri = atoi(p); p = strtok(NULL, "#"); p = strtok(NULL, "#"); strcpy(l[i].Imprumutata, p); p = strtok(NULL, "#"); i++; } for (k = 1; k<i; k++) printf("%d %s %d %s %d %s\n", l[k].ID_carte, l[k].Nume_carte, l[k].Numar_pagini, l[k].Editura, l[k].Cereri, l[k].Imprumutata); }bun deci daca l.as pune asa nu s.ar mai opri la spatiu nu ? cu toate astea nu merge , trebuie cumva sa fie alocate dinamic ? Edited by geomihai00, 13 January 2018 - 22:08. |
#6
Posted 13 January 2018 - 22:57
(i)
Prima eroare e una mai delicata: fi atent ca end-of-file este setata abia cand o functie a incercat sa citeasca peste sfarsitul fisierului. Detalii: Cand fgets() citeste ultima linie din fisier, el se opreste exact pe sfarsitul ei - citeste si sfarsitul de linie dar nimic dupa el, prin urmare NU seteaza indicatorul de end-of-file. De aceea ciclul while continua incercand sa citeasca o noua linie. De data aceasta fgets() seteaza end-of-file FARA A CITI nimic, dar e deja prea tarziu fiindca tu presupui ca a citit o linie si deci continutul lin e ok, incerci sa ‘spargi’ linia cu strtok() iar programul crapa urat fiindca apar pointeri NULL la care tu nu te astepti si ii utilizezi ca atare. Sugestia mea e sa folosesti valoarea intoarsa de fgets() pentru a controla ciclul. Oricum codul e foarte fragil, in primul rand fiindca nu valideaza in nici un fel continutul liniilor. De exemplu nu verifica daca sunt suficiente #, ca daca nu sunt strtok() intoarce NULL cand nu te astepti. (ii) Odata reparata aceasta eroare, vezi pe unde (hint: pe la ce indici) pui valorile cand le citesti si de unde le iei cand le imprimi. (iii) Inca o chestiune care nu e in regula intrucat creeaza confuzie la citirea codului chiar daca nu produce erori: la ce foloseste ultimul apel de strtok()? |
#7
Posted 13 January 2018 - 23:28
a fost pus din greseala , am sa sterg, multumesc de indicatii
Imi poti da o alta idee daca e fragil codu acesta si desigur nu merge si da erori , as vrea sa fac cu structuri deoarece am nevoie in subpunctele urmatoare. Edited by geomihai00, 13 January 2018 - 23:52. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users