Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [c/c++] while(!feof)

    Ciao a tutti...ho un piccolo problema e spero che mi aiutiate a risolverlo

    voglio visualizzare a video il contenuto di un file binario.
    utilizzando il ciclo while(!feof) l'ultima cosa che c'è nel file viene visualizzata 2 volte. Perchè'
    vi posto il codice. Ciao e grazie


    void vis()
    {
    class one op;
    int c=0;
    FILE *p;
    p=fopen("prova.bin","rb");
    while(!feof(p))
    {
    fread(&op,sizeof(class one),1,p);
    cout<<"\n"<<op.n<<"\n"<<op.tel<<endl;
    c++;//controlla quante volte entro nel ciclo
    }
    cout<<c;
    fclose(p);
    }
    There is no dark side of the moon really..matter on fact it's all dark..

  2. #2
    Ragazzi,oltre al su citato problema, ho riscontrato che non posso modificare l'ultimo dato che ho inserito nel file..vi posto il codice per migliore chiarezza...questo programmino è parte di un programma che devo portare ad un esame(riadattato solo per memorizzare,modificare e visualizzare...vi prego di aiutarmi,perchè non so più che pesci prendere ...grazie

    #include <iostream>
    using namespace std;

    class one //classe da memorizzare
    {
    public:
    char n[10];
    char tel[7];
    friend void mod();
    friend void vis();
    friend void insert_file(class one);
    void insert();
    void visual();
    };

    //funzione di inserimento nell'oggetto
    void one::insert()
    {
    cin>>n;
    cin>>tel;
    }

    //funzione di visualizzazione dell'oggetto, anche se nn la utilizzo
    void one::visual()
    {
    cout<<"nome: "<<n;
    cout<<"\ntelefono: "<<tel;
    }


    //il main
    int main()
    {
    class one op;
    int i,n;
    cout<<"quante persone vuoi inserire? ";
    cin>>n;
    for(i=0;i<n;i++)
    {
    op.insert();
    insert_file(op);
    }
    vis();
    mod();
    vis();
    return 0;
    }


    //funzione di modifica
    void mod()
    {
    int pos=0;
    int flag=0;
    class one op;
    char a[10];
    FILE *p;
    cout<<"inserisci cristiano: ";
    cin>>a;
    p=fopen("prova.bin","r+b");
    while(!feof(p))
    {
    fread(&op,sizeof(class one),1,p);
    if(strcmp(op.n,a)==0)
    {
    pos=ftell(p);
    cout<<pos;
    fseek(p,(pos-sizeof(class one)),SEEK_SET);
    pos=ftell(p);
    cout<<pos;
    strcpy(op.tel,"000000");
    fwrite(&op,sizeof(class one),1,p);
    fseek(p,(pos+sizeof(class one)),SEEK_SET);
    }
    }
    fclose(p);
    }


    //funzione di visualizzazione
    void vis()
    {
    class one op;
    int c=0;
    FILE *p;
    p=fopen("prova.bin","rb");
    while(!feof(p))
    {
    fread(&op,sizeof(class one),1,p);
    cout<<"\n"<<op.n<<"\n"<<op.tel<<endl;
    c++;
    }
    cout<<c;
    fclose(p);
    }


    //funzione di inserimento nel file
    void insert_file(class one o)
    {
    FILE *p;
    p=fopen("prova.bin","a+b");
    fwrite(&o,sizeof(class one),1,p);
    fclose(p);
    }
    There is no dark side of the moon really..matter on fact it's all dark..

  3. #3
    utilizzando il ciclo while(!feof) l'ultima cosa che c'è nel file viene visualizzata 2 volte. Perchè'
    perche quando legge l'ultima struttura, il flag EOF nn viene ancora alzato, quindi rientra ancora nel ciclo, l' fread SI ACCORGE SOLO ORA CHE IL FILE è FINITO.....alza l'EOF e torna errore (nn modifica il record passato), e viene eseguita di nuovo la stampa stampa del recordo

    devi aggiungere un

    IF (!FEOF( ))
    cout<<......

  4. #4
    grazie mille!!! mi hai risolto un bel problema
    There is no dark side of the moon really..matter on fact it's all dark..

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.