Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di C232
    Registrato dal
    Dec 2004
    Messaggi
    303

    [ C ] commenti, notazioni e segnalazioni su un listato...

    ragazzi vorrei migliorare un mio programma e accetterò tutti i commenti e segnalazioni per un miglio funzionamento...


    codice:
    #include <stdio.h>
    #include <malloc.h>
    #include <string.h>
    #include <time.h>
    
    #define NOME_FILE "uc.bin"
    #define ERRORE_USCITA "C\'è un solo utente connesso"
    
    int verificaIp(char* IPTmp);
    
    struct strDati {
      char ipUtente[80];
      int oraAccesso;
    };
    
    typedef struct strContDati {
     struct strDati impoUtente;
     struct strContDati* pStesso;
    } impoUtenti;
    
    void liberaMemoria(impoUtenti*);
    
    FILE* fp=NULL;
    int contaUtenti=0;
    int verificaUtente=0;
    
    int main(int argc, char *argv[]) {
    
      char* ipUtenteTmp=getenv("REMOTE_ADDR"); // "127.0.0.1";
      int oraAccessoTmp=time('\0');
    
      impoUtenti* Lista=(impoUtenti*)malloc(sizeof(impoUtenti));
      impoUtenti* cLista=Lista;
    
      printf("content-type:text/html\n\n");
      if(!ipUtenteTmp) {
       printf("%s", ERRORE_USCITA);
       free(Lista);
       exit(1);
      }
    
      fp=fopen(NOME_FILE, "rb");
    
      if(fp==NULL) {
       printf("%s", ERRORE_USCITA);
       free(Lista);
       exit(1);
      }
    
      while(!feof(fp)) {
    
       fread(Lista, sizeof(impoUtenti), 1, fp);
    
       if(verificaIp(Lista->impoUtente.ipUtente)) {
        strcpy(Lista->impoUtente.ipUtente, Lista->impoUtente.ipUtente);
        if(!strcmp(Lista->impoUtente.ipUtente, ipUtenteTmp)) {
         Lista->impoUtente.oraAccesso=oraAccessoTmp;
         verificaUtente=1;
        }
        else {
         Lista->impoUtente.oraAccesso=Lista->impoUtente.oraAccesso;
        }
    
    
        if(!feof(fp)) {
         Lista->pStesso=(impoUtenti*)malloc(sizeof(impoUtenti));
         Lista=Lista->pStesso;
        }
        else {
         Lista->pStesso=NULL;
        }
       }
       else {
        Lista->pStesso=NULL;
       }
    
      }
    
      fclose(fp);
    
      if(!verificaUtente) {
       strcpy(Lista->impoUtente.ipUtente, ipUtenteTmp);
       Lista->impoUtente.oraAccesso=oraAccessoTmp;
       Lista->pStesso=NULL;
      }
    
      Lista=cLista;
      fp=NULL;
      fp=fopen(NOME_FILE, "wb");
    
    
      while(Lista!=NULL) {
       if(Lista->impoUtente.oraAccesso>(oraAccessoTmp-600) && verificaIp(Lista->impoUtente.ipUtente)) {
        fwrite(Lista, sizeof(impoUtenti), 1, fp);
        contaUtenti++;
       }
       Lista=Lista->pStesso;
      }
    
      fclose(fp);
    
      if(contaUtenti>1) {
       printf("Utenti connessi %d", contaUtenti);
      }
      else {
       printf("C\'è un solo utente connesso");
      }
    
      Lista=cLista;
      liberaMemoria(Lista);
      // system("pause");
      return 0;
    }
    
    // verifica ip
    int verificaIp(char* IPTmp) {
      int contaPunti=0;
      int x=0;
    
      for(x=0; IPTmp[x]; x++) {
       if(IPTmp[x]=='.') {
        contaPunti++;
       }
      }
    
      if(contaPunti==3) {
       return 1;
      }
      else {
       return 0;
      }
    }
    
    // libera memoria
    void liberaMemoria(impoUtenti* pTmp) {
     impoUtenti* tLista;
    
     while(pTmp!=NULL) {
      tLista=pTmp->pStesso;
      free(pTmp);
      pTmp=tLista;
     }
    
    }
    C/C++

  2. #2
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Un bel, programma, cosa fa? su che sistema operativo gira?
    Se gira su Unix posso suggerirti di cambiare tutte le fopen fread ecc con open, read ed altre system call.

  3. #3
    Utente di HTML.it L'avatar di Ilmalcom
    Registrato dal
    Oct 2002
    Messaggi
    1,345
    Originariamente inviato da ibykos
    Un bel, programma, cosa fa? su che sistema operativo gira?
    Se gira su Unix posso suggerirti di cambiare tutte le fopen fread ecc con open, read ed altre system call.
    Mi sfugge il motivo di questa tua affermazione. Se non si hanno esigenze specifiche è sempre meglio ricorrere alla stdlib

  4. #4
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    le system call hanno tutta una serie di vantaggi non indifferenti, soprattutto la velocità e la portabilità (sui sistemi derivati da unix come linux o solaris).
    Per quanto riguarda la velocità, invito a provare a leggere un file di testo con fread e prima e con read poi, e a osservare la differenza di tempo impiegato, comunque sia ok, non sono indispensabili per un programma semplice, ma è una buona abitudine fare a meno di stdio.

  5. #5
    Originariamente inviato da ibykos
    le system call hanno tutta una serie di vantaggi non indifferenti, soprattutto la velocità e la portabilità (sui sistemi derivati da unix come linux o solaris).
    [...]
    La protabilita` e` casomai un punto a favore della stdlib, lo standard C del resto e` piu` diffuso del POSIX (un esempio a caso: windows).
    Per la velocita`, cosi` su due piedi direi che dipende dal tipo di I/O. Una syscall e` assai piu` costosa di una libcall, e nel caso, per esempio, di I/O carattere per carattere mi aspetterei migliori prestazioni da parte di stdlib.
    Certo, a quel punto potrei usare un buffer intermedio, ovviamente, ma non e` proprio quello che offre stdlib?
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  6. #6
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    A questo punto propongo una prova di lettura e scrittura di file con un txt grande 1 MB .
    Se non c'è davvero una rilevante differenza di tempi tra la read e la fread allora si, la fread è una bomba e le syscall sono meno utili di quello che pensavo .
    Scriverò codice, testerò e porterò risultati

  7. #7
    Originariamente inviato da ibykos
    A questo punto propongo una prova di lettura e scrittura di file con un txt grande 1 MB .
    Fatto, anche se con un file un po` piu` grossino
    Per chi vuole codice e risultati sono disponibili, non in questo thread pero`, mi pare siamo decisamente OT
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

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 © 2024 vBulletin Solutions, Inc. All rights reserved.