+Graham777 Posted March 9, 2016 Report Posted March 9, 2016 Folosesc f.eof de cele mai multe ori când lucrez cu fișierele, dar am observat că-n practică se citește ultimul număr dintr-un fișier de 2 ori, de exemplu: #include<iostream> #include<fstream> using namespace std; int main() { int t, gasit=0; ifstream f("ex.in"); f>>t; while (!f.eof()) { if ((t-1)%3==0) { cout<<t<<" "; gasit=1; } f>>t; } if (gasit==0) cout<<"Nu exista"; f.close(); return 0; } Care e utilitatea acestuia? Se poate folosi și while (f) în loc de while (!f.eof())? Dacă da, care sunt avantajele/dezavantajele și ce-i cu ultimul f>>t de acolo? Știam că e legat de dubla citire a ultimei valori, dar nu mi-e foarte clar.
+GodsOtherHand Posted March 10, 2016 Report Posted March 10, 2016 indenteaza si tu codul mai frumos si poate o sa observi: #include<iostream> #include<fstream> using namespace std; int main() { int t, gasit=0; ifstream f("ex.in"); f>>t; while (!f.eof()) { if ((t-1)%3==0) { cout<<t<<" "; gasit=1; } f>>t; } if (gasit==0) cout<<"Nu exista"; f.close(); return 0; } intrebarea 1) while (f) ce face? 'f' e un pointer aici catre un fisier, corect? Deci while(f) va fi adevarat cat timp acel pointer != null, deci nu e acelasi lucru ca si (!f.eof()). Al 2 -lea apeleaza metoda eof (de la End Of File) care returneaza TRUE cand a gasit ca esti la finalul fisierului. intrebarea 2) ce-i cu ultimul f>>t de acolo? Pai nu e citire de 2 ori a ultimei valori. e citirea de fiecare data a URMATOAREI valori. codul tau practic e asa: f>>t; //citeste prima valoare (ai grija, codu asta da eroare daca fisierul e gol) while (!f.eof()) //cat timp nu am ajuns la capatul fisierului { if ((t-1)%3==0) // faci aici ce vrei cu valoarea curenta citita { cout<<t<<" "; gasit=1; } f>>t; // aici citesti urmatoarea valoare } daca uiti acel ultim 'f>>t', codul tau nu se va termina niciodata(daca ai mai mult de o valoare), pentru ca nu citesti decat prima valoare din fisier si apoi te intrebi 'am ajuns la final?'. Din moment ce nu mai citesti valori din fisier, nu o sa ajungi niciodata la final. Daca nu ma crezi, incearca Incearca sa nu tocesti codul, invata cat mai logic. 1 love is a verb Love is a doing word
Moderators Courage Posted March 11, 2016 Moderators Report Posted March 11, 2016 f.eof() e O(1)? Eu folosesc while(fin >> n) ca sa citesc toate numerele din fisier.
+GodsOtherHand Posted March 11, 2016 Report Posted March 11, 2016 f.eof() doar verifica unde in fisier se afla pointerul. Din cate imi amintesc, orice fisier se termina cu un caracter (sau2) special. Aceasi idee ca la string, care se termina cu 1 caracter special. Deci da, ar trebui sa fie in timp constant ( adica O(1) ). Daca faci while (fin>>n) { ... } cred ca e acelasi lucru ca si ce a scris Gabriel mai sus, doar ca scrii mai putin si e putin mai clar. Cred ca citirea returneaza null cand a terminat, da nush sa iti zic sigur de ce merge. love is a verb Love is a doing word
Moderators Courage Posted March 11, 2016 Moderators Report Posted March 11, 2016 În C e ceva mai problematică citirea din fişier dacă nu ştii câte numere ai şi vrei să le citeşti pe toate ... (în sensul că while(!feof(fisier)) îţi ia de 2x ultimul număr) Spoiler #include <stdio.h> int main(void) { int x; FILE *fin = fopen("intrare.txt", "r"); while(1 == 1) { fscanf(fin, "%d", &x); if(feof(fin)) break; printf("%d, ", x); } return 0; } Sau ca să nu mai verific în cadrul buclei dacă sunt sau nu la finalul fişierului Spoiler #include <stdio.h> int citire(int *x, FILE **fin) { fscanf(*fin, "%d", &(*x)); if(feof(*fin)) return 0; return 1; } int main(void) { int x; FILE *fin = fopen("intrare.txt", "r"); while(citire(&x, &fin)) printf("%d, ", x); return 0; }
+GodsOtherHand Posted March 11, 2016 Report Posted March 11, 2016 esti sigur ca iti ia de 2 ori ultimul numar? nu ultima valoare citita e chiar EOF si deaia pare sa mearga o data in plus? (mie lene sa rulez codu tau acuma, recunosc :"> ) love is a verb Love is a doing word
Moderators Courage Posted March 11, 2016 Moderators Report Posted March 11, 2016 Dap, ia de 2x ultimu numar (nu merge sa pun link >.< apare eroarea aia cu 403)
+Graham777 Posted April 20, 2016 Author Report Posted April 20, 2016 On 10.03.2016 at 2:02 PM, GodsOtherHand said: esti sigur ca iti ia de 2 ori ultimul numar? nu ultima valoare citita e chiar EOF si deaia pare sa mearga o data in plus? (mie lene sa rulez codu tau acuma, recunosc :"> ) On 10.03.2016 at 2:15 PM, Courage said: Dap, ia de 2x ultimu numar (nu merge sa pun link >.< apare eroarea aia cu 403) Iap, iar în unele cazuri while(f>>t) nu-ți ia ultima valoare. Uite, de exemplu, la problema asta pentru 2 nu merge. În fişierul numere.txt este memorat un şir de maximum 10000 numere naturale, distincte două câte două, cu maximum 4 cifre fiecare, separate prin câte un spaţiu. Pentru un număr k citit de la tastatură, se cere afişarea pe ecran a poziţiei pe care se va găsi acesta în şirul de numere din fişier, dacă şirul ar fi ordonat descrescător, sau mesajul nu există, dacă numărul k nu se află printre numerele din fişier. Alegeţi un algoritm eficient de rezolvare din punct de vedere al memoriei utilizate şi al timpului de executare. Exemplu: dacă fişierul numere.txt conţine numerele 26 2 5 30 13 45 62 7 79, iar k are valoarea 13, se va afişa 6 deoarece 13 s-ar găsi pe poziţia a şasea în şirul ordonat descrescător (79 62 45 30 26 13 7 5 2). M-am gândit la o rezolvare ușor de digerat. #include<iostream> #include<fstream> using namespace std; int main() { int x,c=,k, bun=; ifstream f("numere_v18_S3_4.txt"); cout<<"K?"; cin>>k; while(f>>x) { if(x!=k) if(x>k) c++; else bun++; } if(bun) cout<<c+1; else cout<<"Nu exista"; return ; } Ceva soluții?
Moderators Courage Posted April 22, 2016 Moderators Report Posted April 22, 2016 Păi în mare trebuie să afişezi câte numere din şir sunt mai mari decât k. Unde e buba?
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now