MasterDrive.it   
Vai indietro   MasterDrive.it > Software Development > C/C++



Rispondi
 
Strumenti della discussione Modalità di visualizzazione
Vecchio 18-12-2009, 13:28   #1 (permalink)
Nuovo della community

 
13 Messaggi

leo_w novizio della comunita' ( + 10 )
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 a 16:45.
leo_w non è in linea   Bookmark and Share Rispondi quotando
Vecchio 18-12-2009, 13:59   #2 (permalink)
Moderatore Globale

 L'avatar di bottomap

 
2,774 Messaggi

bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )
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)
bottomap non è in linea   Bookmark and Share Rispondi quotando
Vecchio 19-12-2009, 10:06   #3 (permalink)
Nuovo della community

 
13 Messaggi

leo_w novizio della comunita' ( + 10 )
Question

Quote:
Originariamente inviata da bottomap Visualizza il 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
leo_w non è in linea   Bookmark and Share Rispondi quotando
Vecchio 19-12-2009, 11:49   #4 (permalink)
Moderatore Globale

 L'avatar di AntonioGiuliana

 
6,639 Messaggi

AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )
Quote:
Originariamente inviata da leo_w Visualizza il 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
AntonioGiuliana non è in linea   Bookmark and Share Rispondi quotando
Vecchio 20-12-2009, 19:07   #5 (permalink)
Nuovo della community

 
13 Messaggi

leo_w novizio della comunita' ( + 10 )
Question

Quote:
Originariamente inviata da AntonioGiuliana Visualizza il 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...
leo_w non è in linea   Bookmark and Share Rispondi quotando
Vecchio 20-12-2009, 19:33   #6 (permalink)
Moderatore Globale

 L'avatar di AntonioGiuliana

 
6,639 Messaggi

AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )
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
AntonioGiuliana non è in linea   Bookmark and Share Rispondi quotando
Vecchio 21-12-2009, 09:32   #7 (permalink)
Nuovo della community

 
13 Messaggi

leo_w novizio della comunita' ( + 10 )
Question

Quote:
Originariamente inviata da AntonioGiuliana Visualizza il 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
leo_w non è in linea   Bookmark and Share Rispondi quotando
Vecchio 21-12-2009, 09:56   #8 (permalink)
Moderatore Globale

 L'avatar di bottomap

 
2,774 Messaggi

bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )bottomap e' un tipo da prendere in considerazione ( + 650 )
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)
bottomap non è in linea   Bookmark and Share Rispondi quotando
Vecchio 21-12-2009, 10:13   #9 (permalink)
Moderatore Globale

 L'avatar di AntonioGiuliana

 
6,639 Messaggi

AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )AntonioGiuliana e' un nome conosciuto da tutti ( + 550 )
Quote:
Originariamente inviata da leo_w Visualizza il 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
AntonioGiuliana non è in linea   Bookmark and Share Rispondi quotando
Vecchio 21-12-2009, 20:58   #10 (permalink)
Nuovo della community

 
13 Messaggi

leo_w novizio della comunita' ( + 10 )
Question

Quote:
Originariamente inviata da AntonioGiuliana Visualizza il 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...
leo_w non è in linea   Bookmark and Share Rispondi quotando
Rispondi

Strumenti della discussione
Modalità di visualizzazione

Regole d'invio
Non puoi inserire discussioni
Non puoi inserire repliche
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è attivo
Le smilies sono attive
Il codice IMG è attivo
il codice HTML è disattivato
Trackbacks are attivo
Pingbacks are attivo
Refbacks are disattivato

Salto del forum


Tutti gli orari sono GMT +1. Attualmente sono le 04:57.


Powered by vBulletin versione 3.8.0
Copyright © 2000 - 2010, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.2.0

Valid XHTML 1.0 Transitional  Creative Commons License

Eccetto dove diversamente specificato, i contenuti pubblicati in questa comunità sono rilasciati sotto Licenza
Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia License.
La comunita' di MasterDrive.it non e' responsabile di eventuali imprecisioni presenti nelle pagine.