Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Momentul Aprilie 1964

A fost lansat Ubuntu 24.04 LTS

Free streaming SkyShowtime de la ...

Skoda Fabia 1.0 TSI (110 CP)- 19 ...
 Mezina familiei, Merida BigNine

The Tattooist of Auschwitz (2024)

Se poate recupera numar de telefo...

Upgrade de la MacBook Pro M1 cu 8...
 Ce tip de monitor am nevoie pt of...

Resoftare camera supraveghere

Laptop Gaming

Cu ce va aparati de cainii agresi...
 Nu imi platiti coletul cu cardul ...

Exista vreun plan de terorizare p...

Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone
 

Afisare fisier

- - - - -
  • Please log in to reply
6 replies to this topic

#1
geomihai00

geomihai00

    New Member

  • Grup: Junior Members
  • Posts: 9
  • Înscris: 22.02.2015
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,953
  • Înscris: 24.04.2013
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 creziPosted Image  tu…

#3
geomihai00

geomihai00

    New Member

  • Grup: Junior Members
  • Posts: 9
  • Înscris: 22.02.2015
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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,953
  • Înscris: 24.04.2013
strtok(), asa cum il apelezi tu, nu trebuie sa se opreasca [si] dupa primul spatiu? Mai citeste, CU ATENTIE, documentatia pentru aceasta functie.

#5
geomihai00

geomihai00

    New Member

  • Grup: Junior Members
  • Posts: 9
  • Înscris: 22.02.2015
#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
sags

sags

    Senior Member

  • Grup: Senior Members
  • Posts: 9,953
  • Înscris: 24.04.2013
(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
geomihai00

geomihai00

    New Member

  • Grup: Junior Members
  • Posts: 9
  • Înscris: 22.02.2015
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

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate