|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2005
Città: Brianza (MB)
Messaggi: 2958
|
[C] Richiesta programma - Gestione File
Ciao a tutti mi servirebbe un programmino in C che apre un file *.txt e quando trova il carattere "\n" lo sostituisce con "" (nulla), in modo che non ci siano gli a capo. piccolo accorgimento se "\n" è preceduto da "-" cancellerà anche "-", il risultato in un nuovo file *.txt.
Ex: ------------ prova.txt ------- Ciao come va? Spero tutto bene. Ti va di uscire con me in set- timana a bere qualcosa di fres- co. ----------- ris.txt --------- Ciao come va? Spero tutto bene. Ti va di uscire con me in settimana a bere qualcosa di fresco.
__________________
Trattative forum: +50 # Feedback E-Bay: 206 100% Positivi iPhone 5S 16Gb # Macbook Pro late 2013, 2.3GHz i7, 16Gb DDR3, 500Gb, OSX 10.9.5 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
|
carica il file in un array di caratteri a , quindi
Codice:
i=0; while (a[i]!='\n'&&a[i]!='-'&&a[i]!=EOF) { if(a[i]=='\n'||a[i]=='-') a[i]=''; i++; }
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2 |
![]() |
![]() |
![]() |
#3 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#4 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
|
giustamente
così xò dovrebbe andare Codice:
i=0; while (a[i]!=EOF) { if(a[i]=='\n')//mette spazio al posto d'invio probabile ke escono 2 spazi quando c'è l'invio a[i]=' '; if(a[i]=='-') { // slitta l'array unendo le parole accapo j=i; while (a[i]!=EOF) { a[j]=a[j+1]; j++; } } i++; }
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2 |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
no, non va neanche quello perché EOF non è un char, occupa 2 bytes; ed inoltre la fread non te lo mette nell'array, devi mettercelo manualmente.
EDIT: anche se EOF fosse un byte singolo non andrebbe lo stesso perché l'algoritmo per slittare l'array è bacato (off-by-one, non slitta l'EOF), ed inoltre non elimini il newline dopo il trattino. Ultima modifica di 71104 : 25-10-2006 alle 22:18. |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
|
Quote:
Codice:
i=0; while (a[i]!=EOF) { if(a[i]=='\n')//mette spazio al posto d'invio probabile ke escono 2 spazi quando c'è l'invio a[i]=' '; if(a[i]=='-') { // slitta l'array unendo le parole accapo j=i; while (a[j]!=EOF) { a[j]=a[j+1]; j++; } a[j-1]=a[j]; //copia l'eof } i++; } ![]()
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2 |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
@c&c: certo che du' righe potevi almeno provare a tirarle giú
![]() Codice:
#include <stdio.h> int main(void) { FILE *pIn = fopen( "input.txt" , "r" ), *pOut = fopen( "output.txt", "w" ); if (!pIn) puts("errore apertura file di input"), exit(1); if (!pOut) puts("errore apertura file di output"), exit(1); while (1) // SE FAI while(!feof(pIn)) DEVI RICONTROLLARE DOPO LA LETTURA { int c = fgetc(pIn); // LEGGO if ( feof(pIn) ) break; if (c == '\n' || c == '\r' || c == '-' ) // SALTO IL CARATTERE continue; fputc( c, pOut ); // SCRIVO } fputc( '\n', pOut ); fclose(pIn); fclose(pOut); return 0; }
__________________
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 |
![]() |
![]() |
![]() |
#9 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
__________________
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 |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Non mi sembra didattico postare subito il codice giusto, forse è meglio che lo fate prima ragionare (è evidentemente un esercizio di programmazione che deve fare come compito...)
![]()
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson |
![]() |
![]() |
![]() |
#11 | |||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
Quote:
|
|||
![]() |
![]() |
![]() |
#12 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
@trallallero: il tuo codice ha un paio di problemi:
1) non scrive lo spazio se incontra un newline non preceduto dal trattino 2) mettere fgetc prima di feof secondo me è sbagliato perché se siamo in condizione di EOF fgetc stessa ritorna EOF; ovvero, se feof ti ritorna non-zero vuol dire che sicuramente fgetc ritornerà EOF (almeno così ho capito da www.linuxmanpages.com) ed infine questa parte di codice: Codice:
FILE *pIn = fopen( "input.txt" , "r" ), *pOut = fopen( "output.txt", "w" ); if (!pIn) puts("errore apertura file di input"), exit(1); if (!pOut) puts("errore apertura file di output"), exit(1); |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() che poi sono il primo a criticare chi chiede tutto e subito. Ma stamattina non avevo 'na ceppa da fare e tra il parlar male di Prodi in politica e fare un mini C ho optato per la seconda ![]()
__________________
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 |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2722
|
Quote:
![]() Sono in cerca di situazioni che causano memory leaks anche dopo la terminazione di un programma (insomma, funzioni che si riservano memoria nel loro spazio dei processi (ma non solo), e che non viene liberata (se non esplicitamente) anche dopo aver terminato. Forse la shared memory?
__________________
- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale. - A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson Ultima modifica di -fidel- : 26-10-2006 alle 15:12. |
|
![]() |
![]() |
![]() |
#15 | ||||
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() Quote:
Codice:
int c = fgetc(pIn); if ( c == EOF || feof(pIn) ) break; Quote:
Cosa intendi per leak ? il fatto che non chiudo il primo file se fallisce il secondo ? si é una svista ![]() 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 |
||||
![]() |
![]() |
![]() |
#16 | |||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() perché non ce l'hai messa? che male ti faceva? ![]() Quote:
![]() Quote:
![]() |
|||
![]() |
![]() |
![]() |
#17 | ||
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
L'ho messo nel commento Quote:
![]() ![]() giá tanto che sia riuscito ad aprire e leggere un file ![]()
__________________
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 |
||
![]() |
![]() |
![]() |
#18 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#19 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
- se non siamo a EOF, prima feof restituisce 0 e poi fgetc resituisce un carattere - se siamo a EOF, feof restituisce non-zero facendoti uscire dal ciclo perché se entrassi fgetc restituirebbe EOF perché mai devi ricontrollare dopo la fgetc...? ![]() Quote:
![]() dai su, che quando avete fatto pace vi amate ancora più di prima ![]() ![]() |
||
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
<e a questo punto il Docente, bonariamente, giocherella con il libretto e chiede>
Quando è, secondo Lei, che viene settato l'indicatore di eof, in C (e non, poniamo, in Pascal)? ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:44.