+ Rispondi
Pagina 1 di 2 1 2 UltimaUltima
Risultati da 1 a 10 di 11

Discussione: [C++] scegliere il valore più grande

  1. #1
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    13

    Question [C++] scegliere il valore più grande

    Salve, Vi chiedo aiuto per poter risolvere un problema:
    Ho in una dir una serie di file all'interno dei quali vi sono le informazioni che mi servono.
    Io riesco a scegliere i file da leggere e a scrivere le informazioni (data aaaammgg, e n. file xxx) richieste in un altro file ma quello che non riesco proprio a fare è scrivere nel file la sola data e n. file + nuova.
    Mi spiego meglio il numero file arriva a 099 e poi riparte da 001, se prendo in considerazione il valore + alto, quando ho 5 file dal 097 allo 002 mi dà come risultato il 099 anzichè il 002 quindi la data mi può aiutare, dovrei stabilire quale numero file è il più nuovo.
    Per favore aiutatemi a trovare una soluzione...
    Grazie anticipatamente.

    Codice:
    #include <dirent.h> 
    #include <iostream> 
    #include <string.h> 
     
    using namespace std; 
     
    main () 
    { 
    FILE *fo,*fi; 
    string path; 
    DIR* d; 
    char buf[20]; 
     
    d = opendir(path.c_str()); 
    dirent* f; 
    fo = fopen("ag.txt", "w"); 
     
    if (fo == NULL) { 
    printf("Errore aprendo il file 'fo'\n","ag.txt"); 
    exit(0); 
    } 
    while (f = readdir(d)) 
    { 
    strncpy(buf,f->d_name,20); 
     
     
    if (!strncmp(buf, "aggbd0", 6)) 
    { 
    char appo[20]= ""; 
    char app1[650]= ""; 
    fi = fopen(buf, "r"); 
    if (fi == NULL) { 
    printf("Errore aprendo il file 'fi'\n","ag.txt"); 
    exit(0); 
    } 
    fgets(app1,641,fi); 
    strncpy(appo,app1+629,11); 
    fclose(fi); 
    fprintf(fo,"%s\n",appo); 
    }} 
     
    fclose(fo); 
    }
    I file in dir sono diversi, io considero solo quelli nominati "aggbd0", all'interno dei quali (tutti con lo stesso tracciato e la stessa informazione su ogni riga [n. righe indefinito]) l'info richiesta è dalla pos 629 - 640 \n

    Il tracciato tipo (prima riga):

    xxxxxxxxxx19 114171 xxxxTxxxxxIExxxx xxxxxG xxL 20090105800000522800002700200701318000005131000026 5020011231800000503400002600 000000000000000000000000 0000000000000000000000000309 00000000 00000000Y00000000 B03BA0193180990000000000000000000S 0000000019960714199607153 C 00000000 00000000 00000000 00000000B 00000000 00000000 00000000 E 0 0606 1066601011 00000000 000000000000000 000000000000000 000000000000000 10110011578000000000000000000000000 20091005048

    Grazie.
    l.V.

    P.S.: compilo con borland bcc32 ver. 5.5.1.1
    Ultima modifica di bottomap; 26-01-2010 alle 16:45

  2. #2
    Moderatore Globale L'avatar di bottomap
    reputazione complessiva: 41 41

    Messaggi
    2,952
    Ciao,

    Se puoi usare le API win32, puoi ottenere dale GetFileAttributesEx (GetFileAttributesEx Function (Windows)) una struttura WIN32_FILE_ATTRIBUTE_DATA contenente tra le altre cose la data di ultimo accesso, la data di creazione e quella di ultima modifica. Chiaramente poi dovrai utilizzare le informazioni per "ordinare" il tuo insieme di file.

    In alternativa le numerose varianti della funzione _fstat (_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32) ti permettono di ottenere la stessa informazione.

    In alternativa potresti aprire tutti e cinque i file e stabilire, controllando il contenuto, quale dei tre contiene la data maggiore...

    Ciaociao


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta è no, sarebbe proprio l'ora di farlo...
    - Se un utente ti è stato d'aiuto usa il pulsante Commenta Intervento per aumentare la sua reputazione!

    "La violenza è l'ultimo rifugio degli incapaci" - I.Asimov
    (per chiunque se lo fosse mai chiesto, il nick Bottomap è volutamente sgrammaticato)

  3. #3
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    13

    Question

    Citazione Originariamente Scritto da bottomap Visualizza Messaggio
    Ciao,

    Se puoi usare le API win32, puoi ottenere dale GetFileAttributesEx (GetFileAttributesEx Function (Windows)) una struttura WIN32_FILE_ATTRIBUTE_DATA contenente tra le altre cose la data di ultimo accesso, la data di creazione e quella di ultima modifica. Chiaramente poi dovrai utilizzare le informazioni per "ordinare" il tuo insieme di file.

    In alternativa le numerose varianti della funzione _fstat (_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32) ti permettono di ottenere la stessa informazione.

    In alternativa potresti aprire tutti e cinque i file e stabilire, controllando il contenuto, quale dei tre contiene la data maggiore...

    Ciaociao
    Grazie per la disponibilità,
    gli attributi non possono essere d'aiuto in quanto negli n files sono tutti uguali == l'unica mi sembra quella di aprire gli n files e stabilire quale ha la data più recente.
    In effetti è quello che faccio con il listato che ho pubblicato, genero un files "ag.txt" con all'interno i dati richiesti presi da ogni files con la struttura seguente:
    ...
    20091023063
    20091026064
    20091027065
    20091028066
    20091029067
    20091030068
    20091102069
    20091103070
    20091104071
    20091105072
    ...
    ora dovrei aprire questo file "ag.txt", stabilire quale riga contiene la data più recente e creare un ulteriore file vuoto nominandolo con il numero agg - gli ultimi tre byte della riga contenente la data più recente -.
    Grazie.

    lV

  4. #4
    Moderatore Globale L'avatar di AntonioGiuliana
    reputazione complessiva: 38 38

    Messaggi
    6,737
    Citazione Originariamente Scritto da leo_w Visualizza Messaggio
    Grazie per la disponibilità,
    gli attributi non possono essere d'aiuto in quanto negli n files sono tutti uguali
    Cioè ??

    C'è l'orario di creazione, ultimo accesso ... e quello è indicativo ...
    Antonio GIULIANA

  5. #5
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    13

    Question

    Citazione Originariamente Scritto da AntonioGiuliana Visualizza Messaggio
    Cioè ??

    C'è l'orario di creazione, ultimo accesso ... e quello è indicativo ...
    Si, ma per tutti i files sono uguali ?!?
    Date uguali, orari uguali, sono generati da un front-end al momento della richiesta e quindi differiscono per i dati contenuti e per il nome...

  6. #6
    Moderatore Globale L'avatar di AntonioGiuliana
    reputazione complessiva: 38 38

    Messaggi
    6,737
    Uguali ... ?

    Prova a controllare i valori restituiti per i vari file (Creazione, UltimoAccesso, UltimaScrittura) inserendo nella CreateFile il percorso e il nome del file in questo codice ...

    Codice:
        HANDLE hFile;
        FILETIME ftCreate, ftAccess, ftWrite;
    
        hFile = CreateFile("...", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
        GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite);
        CloseHandle(hFile);
    
        ULARGE_INTEGER uli;
        uli.LowPart = ftCreate.dwLowDateTime; 
        uli.HighPart = ftCreate.dwHighDateTime;
        ULONGLONG s1(uli.QuadPart/10000 );
        cout << "Create: " << s1 << endl;
    
        uli.LowPart = ftAccess.dwLowDateTime; 
        uli.HighPart = ftAccess.dwHighDateTime;
        ULONGLONG s2(uli.QuadPart/10000 );
        cout << "Access: " << s2 << endl;
    
        uli.LowPart = ftWrite.dwLowDateTime; 
        uli.HighPart = ftWrite.dwHighDateTime;
        ULONGLONG s3(uli.QuadPart/10000 );
        cout << "Write : " << s3 << endl;
    Prova per più di un file per capire se sono diversi, anche se per poco ...
    Antonio GIULIANA

  7. #7
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    13

    Question

    Citazione Originariamente Scritto da AntonioGiuliana Visualizza Messaggio
    Uguali ... ?

    Prova a controllare i valori restituiti per i vari file (Creazione, UltimoAccesso, UltimaScrittura) inserendo nella CreateFile il percorso e il nome del file in questo codice ...

    Codice:
        HANDLE hFile;
        FILETIME ftCreate, ftAccess, ftWrite;
    
        hFile = CreateFile("...", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
        GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite);
        CloseHandle(hFile);
    
        ULARGE_INTEGER uli;
        uli.LowPart = ftCreate.dwLowDateTime; 
        uli.HighPart = ftCreate.dwHighDateTime;
        ULONGLONG s1(uli.QuadPart/10000 );
        cout << "Create: " << s1 << endl;
    
        uli.LowPart = ftAccess.dwLowDateTime; 
        uli.HighPart = ftAccess.dwHighDateTime;
        ULONGLONG s2(uli.QuadPart/10000 );
        cout << "Access: " << s2 << endl;
    
        uli.LowPart = ftWrite.dwLowDateTime; 
        uli.HighPart = ftWrite.dwHighDateTime;
        ULONGLONG s3(uli.QuadPart/10000 );
        cout << "Write : " << s3 << endl;
    Prova per più di un file per capire se sono diversi, anche se per poco ...
    Ciao AntonioGiuliana,
    Io compilo con Bcc32, non riesco a compilare il tuo listato
    puoi indicarmi come posso fare?
    Posso inviarti i files così ci dai un'occhiata anche tu,
    Per me hanno tutti gli stessi attributi !?!
    Se vuoi te li posso mettere a disposizione su un ftp ma quando li scarichi e li salvi in locale cambierà la data di creazione, l'ora ecc...
    oppure dimmi tu.
    Ti ringrazio per la tua gentile collaborazione.
    lV

  8. #8
    Moderatore Globale L'avatar di bottomap
    reputazione complessiva: 41 41

    Messaggi
    2,952
    Ciao,

    Il codice postato da Antonio utilizza le API di windows... non dovresti aver problemi a compilare anche con bcc32. Che errori ottieni (non riesco a compilare è un'indicazione un po'generica)?

    Per il problema in sé, è molto difficile che sulla stessa macchina due file vengano creati con lo stesso timestamp (in creazione, ultimo accesso o modifica)... visto che il processore è uno ed il disco è uno (se eventualmente anche il processo che genera i file è uno solo, hai sostanzialmente la certezza).

    Le risoluzione minima del dato ottenuto con la GetFileTime o la GetFileAttributesEx (alal fine lavori sempre con la stessa struttura FILETIME) è di 10 millisecondi per la data di creazione, 2 secondi per la modifica e un valore più alto per l'ultimo accesso (variabile anche a seconda del file system).

    La data di creazione dovrebbe essere abbastanza univoca, a meno che non crei file ad una velocità inferiore a 10ms... se invece devi controllare la data di modifica, può darsi che entro due secondi due file abbiano lo stesso timestamp, in caso la cosa migliore è fare qualche prova...

    Ciaociao


    Venite a farmi un saluto su http://www.bottomap.com/

    - Come porre domande in modo intelligente
    - Hai mai dato un'occhiata al
    Regolamento del Forum? Se la risposta è no, sarebbe proprio l'ora di farlo...
    - Se un utente ti è stato d'aiuto usa il pulsante Commenta Intervento per aumentare la sua reputazione!

    "La violenza è l'ultimo rifugio degli incapaci" - I.Asimov
    (per chiunque se lo fosse mai chiesto, il nick Bottomap è volutamente sgrammaticato)

  9. #9
    Moderatore Globale L'avatar di AntonioGiuliana
    reputazione complessiva: 38 38

    Messaggi
    6,737
    Citazione Originariamente Scritto da leo_w Visualizza Messaggio
    Ciao AntonioGiuliana,
    Io compilo con Bcc32, non riesco a compilare il tuo listato
    puoi indicarmi come posso fare?
    Quando c'e' un errore, questo va indicato ... altrimenti come si fa a dare un'indicazione per risolverlo?

    Spero tu abbia inserito tutti gli include necessari, tra cui, ovviamente

    #include <windows.h>
    Antonio GIULIANA

  10. #10
    Nuovo della community
    reputazione complessiva: 1 1

    Messaggi
    13

    Question

    Citazione Originariamente Scritto da AntonioGiuliana Visualizza Messaggio
    Quando c'e' un errore, questo va indicato ... altrimenti come si fa a dare un'indicazione per risolverlo?

    Spero tu abbia inserito tutti gli include necessari, tra cui, ovviamente

    #include <windows.h>
    Grazie, grazie
    infatti non avevo inserito l' #include <windows.h> e mi davauna miriade di errori.
    adesso è tutto ok, controllo e ti faccio sapere...
    Ciao...

+ Rispondi
Pagina 1 di 2 1 2 UltimaUltima

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi