|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
[C unix] sovrascrittura su file
Ciao a tutti,
vorrei sapere perchè ottengo un'errata scrittura su un file. In particolare, esploro il contenuto della directory corrente, creo un file, e in questo file devo scrivere i nomi della dir corrente...ottengo in output simboli strani quando da shell faccio `cat file.txt`, come se sovrascrivesse o comunque non inserisse correttamente i nomi che listo. Il codice sviluppato è: Codice:
if((op=opendir(cwd))!=NULL)
{
//inserire chdir
chdir(cwd);
while((dir=readdir(op))!=NULL)
{
fd=open(filenuovo,O_RDWR | O_CREAT | O_TRUNC | O_APPEND | O_SYNC,0700);
strcpy(nomi,dir->d_name);
write(fd,nomi,sizeof(nomi));
}
}
close(fd);
closedir(op);
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Com'è inizializzata nomi? Si tratta di un'array di char o di un char*?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Prova a dare un memset(nomi, 0, sizeof(nomi)); prima della strcpy().
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Perché usi contemporaneamente O_TRUNC e O_APPEND?
![]() Strano che si comporti in quel modo, comunque, nonostante il memset()...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
O_APPEND per farsì che riempiendo il buffer non sovrascrivi...anche se lo fa...humm sembra un problema così sciocco eppure nn riesco a capire perchè si comporti così... |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Eh, ma scusa, così dovresti avere più o meno un comportamento indeterminato:
Quote:
E comunque, se lo tronchi, la fine del file è anche il suo inizio, quindi O_APPEND non ha più senso. Prova rimuovendolo, chissà che non risolva.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#9 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Se lo stampi sullo schermo, dir->d_name cosa contiene? E facendo lo stesso con nomi dopo aver usato la strcpy(), hai lo stesso output?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
quando faccio la dir->d_name ottengo i nomi dei file che sono nella cwd corrente e nel momento in cui faccio strcpy ottengo tramite una stampa apposita gli stessi file, in pratica dir->d_name e nomi contengono gli stessi file
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Hai bisogno di scrivere esattamente 255 byte nel file di output o è sufficiente scrivere il nome del file? Perché secondo me dovresti sostituire:
Codice:
write(fd,nomi,sizeof(nomi)); Codice:
write(fd, nomi, strlen(nomi));
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Beh non sono esattamente 255 byte da scrivere però con la strlen neanche va. HO fatto appena ora questa modifica ma ottengo in output 3 caratteri addirittura...sembra un problema a cui non si giunge mai alla fine..
|
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Ho utilizzato queste istruzioni come variante e anche se ottengo un output non corretto + file di prima riesco a vedere...ci sn cmq troppi simboli e dei file che vengono visualizzati come spazi bianchi
Codice:
if((op=opendir(cwd))!=NULL)
{
//inserire chdir
chdir(cwd);
while((dir=readdir(op))!=NULL)
{
fd=open(filenuovo,O_RDWR | O_CREAT | O_TRUNC | O_SYNC | O_APPEND,0700);
//memset(nomi, 0, sizeof(nomi));
//strcpy(nomi,dir->d_name);
//stat(dir->d_name,&st);
printf("stmpa file %s\n",dir->d_name);
write(fd,dir->d_name,st.st_size);
}
//printf("%s\n",nomi);
}
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Oddio scusa, ma m'è venuto un dubbio atroce riguardando la pagina del manuale (sto su Windows e non posso provare direttamente): non è che gli devi passare l'indirizzo in cui si trova l'inizio del buffer?
Prova un po' così: Codice:
write(fd, &nomi, strlen(nomi));
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
|
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Una bella notizia...proprio stamattina mi era sorto un dubbio rispetto a quanti byte restituisce la write, così m sn salvata in una variabile il valore resituito da questa funzione e ho fatto una stampa.
Mi sono accorta che quello che volevo nn erano come dicevamo ieri tutti e 255 byte ma solo quelli relativi a quei file..per cui ho insistito sulla strlen(nomi) come terzo parametro e mi sn accorta che non prendeva bene la lunghezza perchè la chiamata corretta alla funzione è write(fd,nomi, strlen(nomi)+1)--->senza questo +1 non scriveva bene perchè secondo il mio punto di vista bisogna forzare l'andata a capo in coerenza con il concetto di stringa...insomma alla fine con questa correzione va, finalmente in nomi ci sn quei file che voglio e ti ringrazio tanto per la disponibilità, sei stato molto gentile. Ora avrei un altro problema, relativo a quell'altra discussione sui file in cui si richiede di visualizzare il contenuto del secondo file di lunghezza minore, tu hai suggerito di usare una lista...ma un'alternativa?anche perchè rispetto alle cose trattate nel corso, non credo di doverlo risolvere così..tra l'altro ho anche un esercizio simile a questo in cui s chiede di visualizzare il file di seconda lunghezza massima, quindi una volta capita la logica anche questo potrebbe risultarmi semplice... Con la lista mi risulta difficile... |
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
Insomma, non so quali argomenti avete trattato in questo corso, ma hai l'imbarazzo della scelta. Proponi un approccio, o dimmi cosa avete trattato, vedremo qual'è la cosa migliore.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 28-06-2008 alle 13:39. |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:32.





















