PDA

View Full Version : [C] Richiesta programma - Gestione File


c&c
25-10-2006, 16:43
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.

TuLKaS85
25-10-2006, 18:42
carica il file in un array di caratteri a , quindi


i=0;
while (a[i]!='\n'&&a[i]!='-'&&a[i]!=EOF)
{
if(a[i]=='\n'||a[i]=='-')
a[i]='';
i++;
}

71104
25-10-2006, 19:48
----------- ris.txt ---------
Ciao come va? Spero tutto bene. Ti va di uscire con me in settimana a bere qualcosa di fresco. veramente in questo esempio non hai rimosso i newlines, li hai sostituiti con uno spazio (tranne ovviamente dove c'era il "-"). ed inoltre dimentichi che solo su Linux i newlines sono semplici "\n": su Mac sono "\r", mentre su Windows sono coppie "\r\n".

71104
25-10-2006, 19:52
carica il file in un array di caratteri a , quindi


i=0;
while (a[i]!='\n'&&a[i]!='-'&&a[i]!=EOF)
{
if(a[i]=='\n'||a[i]=='-')
a[i]='';
i++;
}
non funziona correttamente: appena trova un newline o un trattino lo sostituisce (non si sa con cosa visto che '' non è un carattere valido) ed esce senza sostituire tutti i successivi. ed inoltre non è così che c&c intendeva gestire i trattini.

TuLKaS85
25-10-2006, 20:07
giustamente
così xò dovrebbe andare
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++;
}

questo dovrebbe andare se invio viene memorizzato come \n

71104
25-10-2006, 22:15
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.

TuLKaS85
26-10-2006, 08:08
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.

beh il newline lo elimina mettendoci spazio al prossimo ciclo, quando fa il primo if, per quanto riguarda l'eof mi ricordo che lo usavo anche con le strighe poi non saperei.... cmq è facile modificare l'idea....

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++;
}
vediamo un pò :)

trallallero
26-10-2006, 08:15
@c&c: certo che du' righe potevi almeno provare a tirarle giú ;)


#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;
}

Ziosilvio
26-10-2006, 10:16
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.
Fare tu i tuoi compiti proprio no, eh?

-fidel-
26-10-2006, 11:03
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...) ;)

71104
26-10-2006, 14:30
beh il newline lo elimina mettendoci spazio al prossimo ciclo, no: al prossimo ciclo lo sostituisci con uno spazio, mentre in quel caso lo devi proprio eliminare.

per quanto riguarda l'eof mi ricordo che lo usavo anche con le strighe poi non saperei.... chiunque te lo può confermare

cmq è facile modificare l'idea....

[cut]

vediamo un pò :) rimane il fatto che EOF occupa 2 bytes, non 1. ed inoltre non elimini il newline dopo il trattino.

71104
26-10-2006, 14:40
@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:

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);

nel caso specifico non da' problemi, ma in generale può causare leak. il discorso che in questo caso non badi ai leak perché tanto il programma termina subito non vale, perché in tal caso il codice manca di metodologia coerente (perché alla fine fai fclose...?)

trallallero
26-10-2006, 15:05
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...) ;)
me culpa :stordita:
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 :D

-fidel-
26-10-2006, 15:06
nel caso specifico non da' problemi, ma in generale può causare leak. il discorso che in questo caso non badi ai leak perché tanto il programma termina subito non vale, perché in tal caso il codice manca di metodologia coerente (perché alla fine fai fclose...?)

Normalmente, se non per abitudine nello scrivere buon codice, è inutile chiudere i vari riferimenti, handle, file descriptors ecc. prima di terminare (anche se, effettivamente, nel codice che hai quitato lo si fa a metà: o tutto o niente, condivido :)). Certo, è buona norma ricordarsene perché poi c'é il rischio di non chiuderli mai (anche quando il programma non deve terminare) andando incontro facilmente a memory leaks (e situazioni simili, come dangling pointers).
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?

trallallero
26-10-2006, 15:29
@trallallero: il tuo codice ha un paio di problemi:
1) non scrive lo spazio se incontra un newline non preceduto dal trattino
vero. L'ho anche testato ma non mi sono accorto :muro:

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)
dici ? quindi forse é meglio:

int c = fgetc(pIn);

if ( c == EOF || feof(pIn) )
break;


ed infine questa parte di 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);

nel caso specifico non da' problemi, ma in generale può causare leak. il discorso che in questo caso non badi ai leak perché tanto il programma termina subito non vale, perché in tal caso il codice manca di metodologia coerente
eh la madonna su un programma che aggiusta 3 righe di testo mi vieni a parlare di metodologia coerente ?
Cosa intendi per leak ? il fatto che non chiudo il primo file se fallisce il secondo ? si é una svista :O


(perché alla fine fai fclose...?)
sono abituato a chiudere la porta quando esco :D

71104
26-10-2006, 15:41
dici ? quindi forse é meglio:

int c = fgetc(pIn);

if ( c == EOF || feof(pIn) )
break;
no, io dicevo proprio di mettere feof come condizione nel while... :mbe:

perché non ce l'hai messa? che male ti faceva? :O

[...] si é una svista :O :Prrr:

sono abituato a chiudere la porta quando esco :D e se hai due porte ne chiudi solo una? :sofico:

trallallero
26-10-2006, 16:09
no, io dicevo proprio di mettere feof come condizione nel while... :mbe:
perché non ce l'hai messa? che male ti faceva? :O

perché se lo metti nella condizione poi lo devi ricontrollare quando leggi.
L'ho messo nel commento

e se hai due porte ne chiudi solo una? :sofico:
guarda oggi sto vicino ad una crisi di nervi :uh: ( voglio il divorzio :muro: )
giá tanto che sia riuscito ad aprire e leggere un file :D

71104
26-10-2006, 18:01
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? hmm, no... secondo me in Win32 di simile trovi sostanzialmente solo gli handle User e GDI (finestre e oggetti grafici).

71104
26-10-2006, 18:05
perché se lo metti nella condizione poi lo devi ricontrollare quando leggi.
L'ho messo nel commento ma perché...? scusa eh...
- 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...? :wtf:

guarda oggi sto vicino ad una crisi di nervi :uh: ( voglio il divorzio :muro: ) ok, allora consiglio da amico: sbattitene ampiamente del C (che non può che peggiorare la tua situazione nervosa) e rappacificati con la muliere :D

dai su, che quando avete fatto pace vi amate ancora più di prima :asd: ("l'amore non è bello se non è litigarello", ti giuro che è vero :D)

Qu@ker
26-10-2006, 19:42
<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)? :Prrr:

71104
26-10-2006, 22:55
:wtf:

quando il file pointer supera l'ultimo byte, ovvero quando una successiva fgetc ritornerebbe EOF... O.o'

prima di allora qualsiasi fgetc non ritornerebbe EOF, ma il byte presente alla posizione indicata dal file pointer... o no? :huh:

-fidel-
27-10-2006, 07:08
hmm, no... secondo me in Win32 di simile trovi sostanzialmente solo gli handle User e GDI (finestre e oggetti grafici).

Sì vero, gli handle ad oggetti GDI (almeno la prima versione, ora con GDI+ 2 devo controllare) vanno chiusi esplicitamente, ora ricordo la voce del prof all'università :rolleyes:
Cosa intendi invece per user handle?

trallallero
27-10-2006, 07:48
ma perché...? scusa eh...
- 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

e allora provalo ;)

#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 (!feof(pIn))
{
int c = fgetc(pIn);

if (c == '\n' || c == '\r' || c == '-' )
continue;

fputc( c, pOut );
}
fputc( '\n', pOut );

fclose(pIn);
fclose(pOut);

return 0;
}

io l'avevo testato al volo, non mi sono accorto dello spazio mancante, ma ho visto che mi scrive l'EOF finale come carattere ascii. Questo é l'output (in neretto il carattere bad):
Ciao come va? Sperotutto bene. Ti va di uscirecon me in settimana a bere qualcosadi fresco.˙

ok, allora consiglio da amico: sbattitene ampiamente del C (che non può che peggiorare la tua situazione nervosa) e rappacificati con la muliere :D

dai su, che quando avete fatto pace vi amate ancora più di prima :asd: ("l'amore non è bello se non è litigarello", ti giuro che è vero :D)
no caro, grazie del consiglio ma il detto é cambiato: "l'amore é bello quando dura poco" :O
dopo 13 anni di litigarello per renderlo bello mi son scassato i maroni :muro:
Beh, almeno non mi sono sposato e devo mantenere solo mia figlia :yeah:

71104
27-10-2006, 15:31
ho fatto la mia versione:

#include <stdlib.h>
#include <stdio.h>

int main() {
FILE *InputFile, *OutputFile;
int Replace;

InputFile = fopen("C:\\input.txt", "r");
if (!InputFile) {
return -1;
}

OutputFile = fopen("C:\\output.txt", "w");
if (!OutputFile) {
fclose(InputFile);
return -1;
}

Replace = 1;
while (!feof(InputFile)) {
int Char;

Char = fgetc(InputFile);
if (EOF == Char) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}

switch (Char) {
case '-':
Replace = 0;
break;
case '\n':
if (Replace) {
if (EOF == fputc(' ', OutputFile)) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}
}
else {
Replace = 1;
}
break;
case '\r':
/* skip */
break;
default:
if (EOF == fputc(Char, OutputFile)) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}
break;
}
}

fclose(InputFile);
fclose(OutputFile);

return 0;
}

e da me funziona perfettissimamente:
tralla-
lallalà,
la primavera è nell'aria,
e io sono un fiore,
con niente di interes-
sante da dire.
trallalallalà, la primavera è nell'aria, e io sono un fiore, con niente di interessante da dire.
notare la chiamata a feof :asd:

71104
27-10-2006, 15:33
ecco, e mi sono appena accorto di un bug nella mia versione :D
vediamo chi lo trova :Prrr:

trallallero
27-10-2006, 15:48
probabilmente o mi stai prendendo per il culo, o sono troppo stordito incazzato io
e non mi sono capito bene :wtf:


while (!feof(InputFile)) {
int Char;

Char = fgetc(InputFile);
if (EOF == Char) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}

anche tu lo controlli 2 volte l'EOF :read:
PS: fra 13 minuti vado in ferie :ciapet:

71104
27-10-2006, 18:38
lol è vero ^^
la forza dell'abitudine di controllare il risultato :Prrr:
proviamo a togliere quell'istruzione e vediamo che succede... :|

EDIT: ah... :|

EDIT2: ma si ma ovvio lo sapevo, era tutta una presa per il culo per vedere se lo sapevate anche voi :read: :read: :read:
pensate a trovare il bug nella mia versione piuttosto :Prrr: :sofico:

trallallero
29-10-2006, 07:22
pensate a trovare il bug nella mia versione piuttosto :Prrr: :sofico:
bah, lo vede anche un bambino che "Replace = 0" c'è solo in caso di "Char == '-' " :O
C'ho preso ? :D Non funge bene se non hai trattini "-" nel file ?

TuLKaS85
29-10-2006, 09:04
bah, lo vede anche un bambino che "Replace = 0" c'è solo in caso di "Char == '-' " :O
C'ho preso ? :D Non funge bene se non hai trattini "-" nel file ?

è proprio questo il problema...
se per esempio hai questo file :

ciao mamma ti presento
il mio amico -invisibile- Jak

il file output scrive

ciao mamma ti presento il mio amico invisibile Jak

togliendo i trattini dove non dovrebbe

allora prima di dare replace =0 ci dovrebbe essere un controllo sul char successivo, se è appunto \n allora si mette replace=0

cmq mi spieghi questo che non l'ho capito x piacere ??

if (EOF == fputc(' ', OutputFile))

controlla se c'è L'EOF dove ?

71104
29-10-2006, 10:59
bah, lo vede anche un bambino che "Replace = 0" c'è solo in caso di "Char == '-' " :O cioè? esempio di input con cui non funziona correttamente? a me pare che Replace vada azzerato solo lì... :mbe:

71104
29-10-2006, 11:01
se per esempio hai questo file :

ciao mamma ti presento
il mio amico -invisibile- Jak

il file output scrive

ciao mamma ti presento il mio amico invisibile Jak

togliendo i trattini dove non dovrebbe

allora prima di dare replace =0 ci dovrebbe essere un controllo sul char successivo, se è appunto \n allora si mette replace=0 esatto, hai vinto un premio :Prrr:

però non mi viene in mente nessun modo semplice ed abbastanza elegante per correggerlo, tutti modi noiosi e pallosi.

cmq mi spieghi questo che non l'ho capito x piacere ??

if (EOF == fputc(' ', OutputFile))

controlla se c'è L'EOF dove ? leggi il man di fputc e lo capirai -.-

trallallero
29-10-2006, 11:20
cioè? esempio di input con cui non funziona correttamente? a me pare che Replace vada azzerato solo lì... :mbe:
beh non l'ho analizzato testato etc ... però c'ero vicino
:Prrr:

però non mi viene in mente nessun modo semplice ed abbastanza elegante per correggerlo, tutti modi noiosi e pallosi.
misuri dim del file ... tutto in ram con fread ... analizzi la memoria con puntatore che scorre ... semplicissimo e immediato :sofico:

leggi il man di fputc e lo capirai -.-non ho il man e nessun help a casa ma se non ricordo male EOF == errore ... anzi, come direste voi romani: erore :D

71104
29-10-2006, 11:29
beh non l'ho analizzato testato etc ... però c'ero vicino
:Prrr: no, a me pare che stessi andando nella direzione opposta: non solo Replace non andava azzerato altrove, ma certe volte non andava azzerato neanche lì!! :Prrr:

misuri dim del file ... tutto in ram con fread ... analizzi la memoria con puntatore che scorre ... semplicissimo e immediato :sofico: va bene solo coi file piccoli :Prrr:

io ho voluto fare una cosa più universale che vada bene anche per quelli grandi :O

non ho il man e nessun help a casa ma se non ricordo male EOF == errore ... www.linuxmanpages.com :read:
cmq si, EOF dalla fputc vuol dire errore

anzi, come direste voi romani: erore :D co ddu ere, come ttera e gguera :O

71104
29-10-2006, 11:32
HA!! mi è venuto in mente come correggere :sofico:
facilissimo ed elegantissimo :Prrr:
ora lo faccio :read:

71104
29-10-2006, 11:42
voilà:

#include <stdlib.h>
#include <stdio.h>

int main() {
FILE *InputFile, *OutputFile;
int Dash;

InputFile = fopen("C:\\input.txt", "r");
if (!InputFile) {
return -1;
}

OutputFile = fopen("C:\\output.txt", "w");
if (!OutputFile) {
fclose(InputFile);
return -1;
}

Dash = 0;
while (1) {
int Char;

Char = fgetc(InputFile);
if (EOF == Char) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}

switch (Char) {
case '-':
Dash = 1;
break;
case '\n':
if (!Dash) {
if (EOF == fputc(' ', OutputFile)) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}
}
break;
case '\r':
/* skip */
break;
default:
if (Dash) {
if (EOF == fputc('-', OutputFile)) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}
Dash = 0;
}
if (EOF == fputc(Char, OutputFile)) {
fclose(InputFile);
fclose(OutputFile);
return -1;
}
break;
}
}

fclose(InputFile);
fclose(OutputFile);

return 0;
}

TuLKaS85
29-10-2006, 21:48
ciao, scusami se ti cerco il pelo... :D :D

se ci sono -- 2 trattini consecutivi tipo a casa di --Luigi--
perdi un trattino per strada....

la prima versione mi piaceva di + ad essere sincero, non c'è un modo per controllare il carattere dopo il - ??

tipo ci vorrebbe un if prima del replace=0 purtroppo se si legge con getc il valore successivo per vedere se c'è lo \n poi come si ritorna indietro ??

avrei pensato ad un contatore dei caratteri letti fino a quel momento
dopodichè si chiude e riapre il file iterando la getc fino al contatore....

app=getc(inputfile);
if(app=='\n')
replace=0;
//ripristino file
fclose(inputfile);
fopen("C:\\input.txt", "r");
for(i=0;i<cont;i++)
app=getc(inputfile);

71104
29-10-2006, 22:51
ciao, scusami se ti cerco il pelo... :D :D ANNNZI, mi fa molto piacere :D
è divertente (nonché sicuramente istruttivo) cercare in due i bug negli algoritmi :)

se ci sono -- 2 trattini consecutivi tipo a casa di --Luigi--
perdi un trattino per strada.... giusto, infatti non c'avevo pensato :P

la prima versione mi piaceva di + ad essere sincero, non c'è un modo per controllare il carattere dopo il - ?? si che c'è ma ciò che non mi piacerebbe per niente di quella ipotetica versione sarebbero le piccole fastidiose duplicazioni di codice (e già ce ne sono a causa delle fclose); ma adesso faccio lo stesso un tentativo e cerco di eliminare le duplicazioni dividendo in più funzioni.

TuLKaS85
29-10-2006, 22:54
ANNNZI, mi fa molto piacere :D
è divertente (nonché sicuramente istruttivo) cercare in due i bug negli algoritmi :)

giusto, infatti non c'avevo pensato :P

si che c'è ma ciò che non mi piacerebbe per niente di quella ipotetica versione sarebbero le piccole fastidiose duplicazioni di codice (e già ce ne sono a causa delle fclose); ma adesso faccio lo stesso un tentativo e cerco di eliminare le duplicazioni dividendo in più funzioni.

e come si torna indietro al carattere precedente ??
cioè c'è un istruzione che torna indietro sul file ?

jappilas
29-10-2006, 22:57
io avrei pensato a una minimale macchina a stati... :mc:

71104
29-10-2006, 23:05
ariecchice:

#include <stdlib.h>
#include <stdio.h>

int main() {
FILE *InputFile, *OutputFile;
int Result;

InputFile = fopen("C:\\input.txt", "r");
if (!InputFile) {
return -1;
}

OutputFile = fopen("C:\\output.txt", "w");
if (!OutputFile) {
fclose(InputFile);
return -1;
}

Result = 0;
while (1) {
int Char;

Char = fgetc(InputFile);
if (EOF == Char) {
Result = -1;
break;
}

switch (Char) {
case '-':
Char = fgetc(InputFile);
if (EOF == Char) {
Result = -1;
break;
}

if (('\n' != Char) && ('\r' != Char)) {
if (EOF == fputc('-', OutputFile)) {
Result = -1;
break;
}
if (EOF == fputc(Char, OutputFile)) {
Result = -1;
break;
}
}
break;

case '\n':
if (EOF == fputc(' ', OutputFile)) {
Result = -1;
break;
}
break;

default:
if (EOF == fputc(Char, OutputFile)) {
Result = -1;
break;
}
break;

}
}

fclose(InputFile);
fclose(OutputFile);

return Result;
}

però non è che sia riuscito tanto ad eliminare le duplicazioni.

71104
29-10-2006, 23:08
ecco, così va un po' meglio: ^^

#include <stdlib.h>
#include <stdio.h>

int main() {
FILE *InputFile, *OutputFile;
int Result;

InputFile = fopen("C:\\input.txt", "r");
if (!InputFile) {
return -1;
}

OutputFile = fopen("C:\\output.txt", "w");
if (!OutputFile) {
fclose(InputFile);
return -1;
}

Result = -1;
while (1) {
int Char;

Char = fgetc(InputFile);
if (EOF == Char) {
Result = 0;
break;
}

switch (Char) {
case '-':
Char = fgetc(InputFile);
if (EOF == Char) {
break;
}

if (('\n' != Char) && ('\r' != Char)) {
if (EOF == fputc('-', OutputFile)) {
break;
}
if (EOF == fputc(Char, OutputFile)) {
break;
}
}
break;

case '\n':
if (EOF == fputc(' ', OutputFile)) {
break;
}
break;

default:
if (EOF == fputc(Char, OutputFile)) {
break;
}
break;

}
}

fclose(InputFile);
fclose(OutputFile);

return Result;
}

71104
29-10-2006, 23:09
ARGH, mi sono accorto che tutti quei break in caso di EOF non escono dal while ma solo dallo switch... :|

vabbè, a quest'ora non ho abbastanza cervello attivo da poter addirittura pensare -.-

riprendo domani

TuLKaS85
30-10-2006, 19:25
scusa, non ho capito lo scopo di result...

e cmq per i break non basterebbe mettere return -1 ??

per il resto non sono riuscito a trovare nessun altro bug :D :D

71104
31-10-2006, 14:38
scusa, non ho capito lo scopo di result... l'ho introdotta perché così ho unificato tutti i return in un unico "return Result" che sta alla fine.

e cmq per i break non basterebbe mettere return -1 ?? e chi li chiude i fd?

per il resto non sono riuscito a trovare nessun altro bug :D :D :Prrr: