Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115

    [C++] Funzioni "seekp()" / "seekg()"

    Salve, dovrei studiare queste due funzioni per l'accesso ad un file in modo casuale. Quel che ho letto afferma che la funzione seekp() è associato ad un puntatore del file 'system' di nome "put", dedicato all'output su file, mentre seekg() è associato ad un puntatore del file 'system' di nome "get", dedicato all'input su file. Ora io non ho perfettamente capito il concetto, ho anche cercato un po' qua e la ma non ne sono venuto a capo. Sul libro di studio mi è stato fatto un esempio, cioè:
    codice:
    #include <iostream.h>
    #include <fstream.h>
    #include <conio.h>
    main()
    {struct rec
      {char c;
       int x;
       char s[10];
       };
    rec r;
    clrscr();
    ofstream out("set3",ios::out | ios::binary);
    if(!out){cout<<"impossibile aprire il file";
      return 1;
      }
    out.seekp(4*sizeof r,ios::beg);
    cout<<"inseisci car";
    cin>>r.c;
    cout<<"ins num" ;
    cin >>r.x;
    cout<<"ins str ";
    cin>>r.s;
    out.write((unsigned char *) &r,sizeof r);
     out.close();
    rec r2;
    ifstream in("set3",ios::in | ios::binary);
    in.seekg(4*sizeof r2,ios::beg);
    in.read((unsigned char *) &r2, sizeof r2);
    cout<<"\n"<<r2.c;
    cout<<"\n"<<r2.x;
    cout<<"\n"<<r2.s;
    in.close();
    getch();
    return 0;
    }
    Io non capisco. Creo un record con 3 campi, verifico se il file è stato creato ecc.. e poi:
    codice:
    out.seekp(4*sizeof r,ios::beg);
    Non capisco esattamente cosa succede. Ho capito che il puntatore è stato spostato di 4 posizioni più avanti, quindi il record scriverà su file da quella determinata posizione. Ma non capisco se quella posizione è calcolata in record, o meglio, io stò scrivendo sul 4° record del tipo 'rec'? Perché l'esempio ha creato un solo record, ne dichiara uno solo:
    codice:
    rec r;
    Posso capire se avessi scritto:
    codice:
    rec r [10];
    In questo caso mi stò spostando al 4/10 record per scrivere li.
    Ovviamente non sarà così, infatti vi chiedo un aiuto per comprendere meglio. Grazie infinite.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Qualcuno può aiutarmi? (up)

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Stai semplicemente dicendo al programma: vai in posizione X e scrivi il contenuto del singolo record. Quello che c'è tra l'inizio del programma e la posizione X riempilo di spazzatura (che però va conteggiata nel calcolo del posizionamento).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Quindi mi posiziono di N Byte, no di N Record?
    Questa tecnica a cosa serve? Ci sono utilizzi e motivi?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da Mauri94
    Quindi mi posiziono di N Byte, no di N Record?
    Tecnicamente lo spostamento è sempre calcolato in bytes.
    Però 1 record == sizeof(rec) bytes, quindi ai fini pratici è la stessa cosa.
    Questa tecnica a cosa serve? Ci sono utilizzi e motivi?
    Ad accedere ai dati in modo casuale, ovviamente. Puoi creare un file pieno di buchi che puoi riempire in un secondo momento.
    Nell'esempio che hai dato è possibile in seguito riaprire il file (in modalità in | out per non cancellare tutto), posizionarsi a 2*sizeof(rec) e scrivere di nuovo.
    Emule e bittorrent trattano così i file.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    115
    Grazie mille!

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.