Jump to content

Recommended Posts

Posted

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.

Posted

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 :P

Incearca sa nu tocesti codul, invata cat mai logic.

  • Upvote 1

love is a verb
Love is a doing word

Posted

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
Posted

Î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 :D ... (î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;
}

 

 

Posted

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

  • 1 month later...
Posted
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?

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.