|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Mar 2006
Messaggi: 31
|
[c] creazione file
ciao,
sto facendo un programmino in c che mi crea un numero direi "stratosferico" di file. per nominarli in modo differente ho pensato di ricorrere a un contatore....ma anche facendo un long double è troppo piccolo per le mie necessità. ho cosi creato un char* x che inizialmente vale "1\0"...in pratica ho fatto una stringa. Ogni volta che creo un file incremento il valore del mio char * tramite un apposita funzione...ma... nel momento in cui faccio un assegnamento del tipo : x[0]="1" (ho provato anche con apici singoli..... mi da un errore di segmention fault.....perchè???? se uqalcuno riesce riesci a darmi una risposta ne sarei molto grato. Saluti Diego |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
devi creare più di 18.446.744.073.709.551.615 (18 miliardi di miliardi) di files...?!? :|
ti consiglio di cambiare design :| PS: ma che HDD usi? e che filesystem? |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]()
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Apr 2003
Messaggi: 2516
|
Quote:
Non è che in realtà pensavi che un long double fosse pù piccolo? Controlla meglio ![]()
__________________
Sono un utente Apple consapevole. Vivi e lascia vivere. |
|
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]() Per prima cosa dovresti dirci quale tipo di file system stai usando. In tutti i filesystem ci sono degli ovvi limiti per quanto riguarda il numero totale dei file e la dimensione massima di un file! Ad esempio per la FAT32 puoi avere al massimo 268.435.437 file mentre per NTFS puoi avere al massimo 4.294.967.295 (2^32 - 1) file. Quindi si evince facilmente che un unsigned long (32 bit senza segno) dovrebbe esserti assolutamente più che sufficiente!!! Poi facciamo una considerazione molto pratica: ammesso di avere, per pura ipotesi, 4.294.967.295 file nel tuo file system, supponendo che la dimensione di 1 cluster sia 4 KByte (dimensione tipica ma potrebbe anche essere di più), avresti bisogno come minimo di uno spazio di 17592186040320 Bytes, che equivale a circa 16 TeraByte. Hai l'hardware e le risorse finanziarie adatte per avere un sistema di storage da 16 TB??? ![]() ![]() ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Apr 2006
Città: Trieste
Messaggi: 141
|
Quote:
Per ovviare fai char stringa[MAX_SIZE]; Per il nome usa un unsigned long non un double. Inoltre se devi cambiare il nome, considera che dopo il 9 (il 10 N.d.A) hai 2 cifre, quindi dovresti spostare il nome di un carattere a destra: il modo più semplice è leggere il nome del file in una stringa su cui fai degli strtok per recuperare le informazioni; quindi riscrivi la stringa con sprinft con le informazioni aggiornate. Saluti
__________________
HardwareStation.net Overclockers Team ------------------------------------------------ www.GilVegliach.eu Internet, Informatica, Tecnologia |
|
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() ![]() ![]() ![]() ![]() ![]() |
|
![]() |
![]() |
![]() |
#9 | |
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
Quote:
![]()
__________________
sign editata dallo staff |
|
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#11 |
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
stavo pensando (seriamente) a una possibile soluzione del problema...la cosa più semplice che mi è venuto in mente è "wrappare" questo megatipo con una classe ah hoc che utilizza una struttura dati dinamica per esempio il vector della standard template library...
qualcosa del genere: #include <vector> using namespace std; #define MAX_LIMIT 18 miliardi e rotti...... class mega_tipo { public: static unsigned __int64 index; megatipo() {great_buffer.push_back(0);} void Increment(){ if(great_buffer[index]==MAX_LIMIT) { great_buffer.push_back(1); index++; } else great_buffer[index]++; } private: vector<unsigned __int64> great_buffer; } si potrebbero anche intercettare le eccezioni per capire quando trabocchiamo....in pratica raggiunto il limite aggiungo un altro "campo" unsigned__int64 e incremento quello...e così via finchè..................c'è memoria ![]() è chiaro che poi bisogna gestire i vari campi del vector...non è banale ma nemmeno impossibile. eh eh
__________________
sign editata dallo staff |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
![]() Ma come ho già detto nel mio post sopra, ci sono dei limiti teorici, molto più stretti, ed anche dei limiti pratici ...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#13 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
E aggiungo che faresti bene a prendere il Kernighan&Ritchie e studiarlo, soprattutto il capitolo 5. Anche un'occhiatina a c-faq.com non ti farebbe male.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Aug 2006
Messaggi: 365
|
a parte l'essere rimasto letteralmente sconvolto dalla richiesta
![]() volevo solo fare una piccola precisazione per tutti quelli magari non molto pratici di C che dovessero capitare in questo post e leggere questa frase: Quote:
![]() ![]() in realtà il puntatore punta ad una zona contigua di memoria di dimensione allocata precedentemente, quindi se dà segmentation fault è perché non c'è spazio allocato a sufficienza, ma se prima viene dichiarata la dimensione della stringa (anche inizializzandola direttamente, non solo mediante [<dimensione>]) essa è tranquillamente accessibile con dereferenziamenti del puntatore char* scusate se magari sono andato un po' fuori post ma tenevo a precisare questa cosa per non confondere la gente che si avvicina al C |
|
![]() |
![]() |
![]() |
#15 | |
Utente sospeso
Iscritto dal: Oct 2002
Messaggi: 2156
|
Quote:
lui usa dei numeri per dare i nomi ai file....con questo tipo dovrebbe riuscirci...ovviamente ci sono problemi a livello di rappresentazione del numero e bisogna lavorare un bel po sulla classe megatipo.....poi è anche ovvio che almeno per windows c'è sempre il limite massimo di 255 caratteri per il nome di un file.... vabbè.....comunque questa richiesta è veramente strana e bisognerebbe fare una memories delle richieste più assurde che si leggono e inserire questa
__________________
sign editata dallo staff |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:17.