Ciao Ragazzi devo fare un programma per il corso di algoritmi ma non da dove iniziare mi date una mano?
La traccia è questa:
Scrivere un programma ANSI C che acquisisce un file di testo e due stringhe e poi costruisce un nuovo file di testo ottenuto dal file di testo precedente sostituendo ogni occorrenza della prima stringa con la seconda stringa.
Ti prego aitatemi è urgente
Io procederei così:
Definisci due variabili tipo FILE e due vettori di caratteri; apri il file di origine con la funzione fopen e leggilo parola per parola con la funziona fscanf; per ogni parola letta confrontala mediante la funzione strcmp con la prima stringa (letta da tastiera con la funzione scanf); se coincidono scrivi sul file di destinazione la seconda stringa, altrimenti la stringa che hai letto dal primo file
Io ho iniziato a fare così:
#include
#include
char replace_str(FILE, char *, char *);
int main(void)
{
FILE *pfile1;
FILE *pfile2;
char stringa1[1000];
char stringa2[1000];
char contenitore[4096];
pfile1 = fopen ( "file1.txt" , "r" );
pfile2 = fopen ( "file2.txt" , "w" );
printf("\nInserire la stringa da cercare: " ;);
scanf("%s", stringa1);
printf("\nInserire la stringa da sostituire: " ;);
scanf("%s", stringa2);
contenitore = pfile1;
/*chiamo la funzione per la sostituzione*/
replace_str(pfile1, stringa1, stringa2);
/*scrive il contenuto della variabile contenitore nel file2*/
fwrite (contenitore , sizeof(contenitore[0]) , sizeof(contenitore) , pfile2 );
fclose (pfile1);
fclose (pfile2);
return 0;
}
char replace_str(FILE pfile1, char stringa1, char stringa2)
{
static char contenitore[4096];
char *p;
if(!(p = strstr(pfile1, stringa1)))
return pfile1;
strncpy(contenitore, pfile1, p-pfile1);
contenitore[p-pfile1] = '\0';
fprintf(contenitore+(p-pfile1), "%s%s", stringa2, p+strlen(pfile1));
return contenitore;
}
Però non mi funziona.
almeno è a compilazione zero?
In che senso a comilazione zero?
Scusami in che senso a compilazione zero?
Hai commesso un po di errori:
Non puoi porre contenitore = pfile1 (tra l'altro non ne ho capito l'utiltà) perchè contenitore è un vettore di char, mentre pfile1 è un puntatore a file;
replace_str(pfile1, stringa1, stringa2) ritorna un valore char che ti sei dimenticato di salvare da qualche parte;
la funzione strncpy() non esiste, forse volevi scrivere strcpy();
P.S.
Se vuoi modificare un tuo messaggio c'è il tasto edit ;)
Questo messaggio è stato aggiornato da benna il 15/05/2007 alle ore 17:51:58
a compilazione zer0 significa con zero errori, ma in senso ironico perchè dal codice sono evidenti molti errori :D,
e benna ha confermato ;).
Poi una domanda, sono cieco o non vedo la get dal file?:eek:
Questo messaggio è stato aggiornato da marcoff il 15/05/2007 alle ore 18:59:48
Ciao grazie per la risposta però ti chiedo se per piacere me lo puoi compilarlo fino ad eseguirlo.
Ciao
Allora Gesux piuttosto che compilarlo ed eseguirlo, avrei preferito discuterne insieme a te, secondo la mia opinione sarebbe bene capire le cose che si fanno piuttosto che averle belle e fatte.
Comunque in ogni caso ti aiuto lo stesso ;), anche se ti premetto che è inutile compilare questo listato, perchè è sbagliato proprio nella logica.
In ogni caso fammmi una cortesia, siccome sono dell'idea che questo codice da te postato non sia opera tua, potresti postare sul forum da cui lo hai preso e dire a chi lo ha fatto d leggersi un bel pò di manuali? Grazie.:D :duo
Tornando a te, ora ti aiuto io.;)
Questo messaggio è stato aggiornato da marcoff il 16/05/2007 alle ore 13:36:03
#include
#include
#include
int sostituisci(const char *szNomeFileInput,const char *szNomeFileOutput,
const char *szStringaDaCercare,const char *szStringaNuova);
int main (){
char string1[80];
char string2[80];
char nome_f1[9];
char nome_f2[9];
strcpy(nome_f1,"file1.txt" ;);
strcpy(nome_f2,"file2.txt" ;);
printf("Inserisci la prima stringa: " ;);
scanf("%s",string1);
printf("Inserisci la seconda stringa: " ;);
scanf("%s",string2);
int esito = sostituisci(nome_f1,nome_f2,string1,string2);
if(esito==0){
printf("Nessuna occorrenza nel file!!!" ;);
}else{
printf("Numero occorrenze trovate: %d",esito);
}
system("pause" ;);
return 0;
}
int sostituisci(const char *szNomeFileInput,const char *szNomeFileOutput,const char *szStringaDaCercare,const char *szStringaNuova){
int iOccorrenze = 0;
bool trovato;
FILE *pInputStream, *pOutputStream;
char flusso_inp[512], flusso_out[512];
char *pStart, *pEnd;
pInputStream = fopen(szNomeFileInput, "rt" ;);
if (pInputStream != NULL) {
pOutputStream = fopen(szNomeFileOutput, "wt" ;);
if (pOutputStream != NULL) {
while (fgets(flusso_inp, 512,pInputStream) != NULL) {
trovato=true;
flusso_out[0] = '\0';
pStart = flusso_inp;
while (trovato) {
pEnd = strstr(pStart, szStringaDaCercare);
if (pEnd == NULL) {
strcat(flusso_out, pStart);
trovato=false;
}
if(trovato){
iOccorrenze += 1;
strncat(flusso_out, pStart, (pEnd - pStart));
strcat(flusso_out, szStringaNuova);
pStart = pEnd + strlen(szStringaDaCercare);
}
}
fputs(flusso_out, pOutputStream);
}
}
}
return iOccorrenze;
}
Prova un pò con questo, e fammi sapere dovrebbe funzionare,
se c'è qualcosa che non va poi la vediamo insieme, l'ho pensato ma non l'ho ne compilato ne testato. Fammi sapere.;)
Questo messaggio è stato aggiornato da marcoff il 19/05/2007 alle ore 14:52:55
Ciao e grazie mille per avermi risposto e per il programma.Il programma l'ho compilato ma nella conversione mi da errore.
Ti invio tramite allegato cosa esce quando lo compilo.
Grazie ancora.
L'errore che mi da nel compilarlo è:
"Inserisci la prima stringa:uno
Inserisce la seconda stringa:due
string1: unostring_daf: unoPremere un tasto per continuare"
Poi nel premere un tasto mi da errore e si chiude.
Ciao
Allora Gesux, non mettiamo tutti questi post inutili,
metti aggiornndo uno dei post precedenti un printscreen dell'errore e poi vediamo.
Ps: ma il file di inputlo hai creato?
Ciao ciao.
Questo messaggio è stato aggiornato da marcoff il 16/05/2007 alle ore 16:50:39
Ok e scusami se ne ho scritti parecchi.
Allora l'errore che mi da è:
Il programma l'ho compilato ma nella conversione mi da errore.Questo è quello che mi da quando lo compilo:
"Inserisci la prima stringa:uno
Inserisce la seconda stringa:due
string1: unostring_daf: unoPremere un tasto per continuare"
Poi nel premere un tasto mi da errore e si chiude.
Il file di imput lo creato.
ciao e grazie
Ok, appena ho un minuto l'ho compilo io, che compiltore stai utiizzando?
Il Dev C++.
Ciao
Ciao marcof,oggi domandando ad alcuni miei amici mi hanno detto che il prof non vuole le istruzioni break ed exit.Confido in una tua risposta
Ciao e mille grazie.
ciao gesux ho aggiornato il programma nel mio primo post, prova un po e dimmi se funziona, per quanto riguarda il break, e per terminare il while ma lo puoi stoppare tranquillamente con un flag, io non ho avuto tanto tempo per ragionarci.:D
Comunque penso che adesso funziona.Fammi sapere se hai difficolta.
Edit: adesso se non ho sbagliato dovrebbe dirti anche quante occorrenze ha aggiornato.;)
;)
Questo messaggio è stato aggiornato da marcoff il 17/05/2007 alle ore 19:43:14
Mi sembra strano che il professore non voglia che usiate le istruzioni break ed exit, perchè sono due funzioni usatissime ed utilissime, quasi necessarie
In realta i jump break and exit sono due funzioni molto usate, ma sono consigliate nei programmi semplici.
Si dovrebbero evitare nei cicli, perche infatti e' li che creano problemi, in quanto forzano l-uscita dai cicli spesso senza liberare la memoria, e inoltre per i programmi complessi, rendono il software poco leggibile e manutenibile.
Ps: io li ho usati per fare velocemente, alla fine questo programma e' banale, per eliminare il break basta usare un semplice flag.;)
Grazie marcoff ora lo provo e ti faccio sapere.
Di niente, fammi sapere solo se funziona.;)
Wow che dire......non ho resistito a leggere la discussione e sono sempre più convinto che siete dei grandi purtroppo queste cose le ho fatte tempo fa sono perito informatico ma sto per laurearmi in culture digitali e della comunicazione che c'entra ben poco con ste cose....non mi resta che complimentarmi con marcoff sei davvero un genio :) bravi tutti saluti...
E dai non esageriamo ho solo aiutato Gesux.;):D
Grazie ancora marcoff è confermo anch'io che sei un grande.Il programma funziona a dovere ora provero a togliere l'istruzione break e poi ti faccio sapere.
Ciao ancora e grazie mille.
di niente.;)
Non esageriamo!!! Grande...:D no vabbè :Dbravo marcoff;)
Tanto per chiarire il concetto....
l'errore che riscontravi nella versione precedente, visto che ora funzona, era dovuto al fatto che erano state passate ala funzione strstr() non due stringhe ma solo due indirizz di memoria.;)
Ps: hai risolto per l'eliminazione del break?;)
Ciao marcoff ho provato ha toglierlo ed ad usare la funzione che mi hai suggerito ma non me lo compila.Se puoi fare un'altro tentativo ad aiutarmi a risolverlo l'ultimo conveniente di questo progetto.
Poi alla fine ti offriro una cena.
Ciao e ti ringranzio anticipatamente.
che funzione hai usato?
Cmq in ogni caso prova un pò adesso e fammi sapere.;)
Questo messaggio è stato aggiornato da marcoff il 19/05/2007 alle ore 14:54:16
Ciao marcoff, ho provato il tuo programma ma non lo compilava perchè mi dava un errore con bool e quindi ho sostituito bool con it e ora funziona tranquilamente.
Marcoff Ti ringrazio ancora per tutto il tuo aiuto e per avermi sopportato e posso dirti che sei un grande anzi un grandissimo.Ciao
il fatto che ti dava errori di compilazione con il tipo bool, dipende sicuramente dal compilatore che stai usando, si comunque con un intero dovrebbe funzionare tranquillamente, l'importante è rispettare le inizializzazioni come era stato fatto per il tipo bool.
Ciao.
PS: ho fatto il possibile.;)
ciao marcoff ancora grazie ma ora mentre stavo relazionando l'algoritmo mi sono battuto su due problemi
quali la coretteza e la complessita dell'algoritmo.
Mi puoi dare una mano.
ciao
puoi siegarti meglio?
devi creare documentazione interna ed esterna?
cosa intendi per correttezza?
Scusami marcoff ma se ti rispondo solo ora ho avuto dei problemi,cmq grazie per avermi ho risposto,oggi ho rivisto delle mie dispense di algoritmi e sono riuscito a capirli.
Ciao e ti ricordo che sei un grande.
di niente ;).
Ciao marcoff ho presentato il progetto al prof ma mi ha detto, ti riporto cosa mi ha scritto:
"Limite statico imposto sulla lunghezza delle stringhe di ricerca
e sostituzione (80 caratteri) e sui nomi dei file (10 caratteri).
Soluzione alternativa: l'acquisizione di stringhe senza limiti"Questo per quanto riguarda la Progettazione dell'Algoritmo.
Mentre per il Funzionamento mi ha detto :
Funzionalita' limitata: Funzionalita' limitata: le stringhe di ricerca e sostituzione
possono essere soltanto parole singole, ovvero non possono
essere frasi con parole separate da spazi.
Mi protesti aiutare per risolvere questo problema.
Se vuoi ti riporto di nuovo il codice.
Ciao
certo che ti aiuto, ma tu non puoi allegare l'analisi scritta dal prof?
E' ovvio che c'erano questi limiti, a me nessuno ha detto di elminarli.
Questo messaggio è stato aggiornato da marcoff il 14/06/2007 alle ore 15:52:53
ok ti ho allegato la valutazione del progetto.
Ti ringrazio ancora per il tuo aiuto.
Ciao
(https://www.forumzone.it/images/misc/attach_legacy.gif) (https://www.forumzone.it/attachment_legacy.php?dir=Gesux&file=2007614183812_Valutazione.zip)
Questo messaggio è stato aggiornato da Gesux il 14/06/2007 alle ore 18:38:20
ciao marcoff volevo sapere se avevi letto la valutazione?
Ciao
Si l'ho letta e ti aiuto appena trovo un minuto di tempo, bisogna apportare lievi modifiche al programma e il gioco è fatto.;)
Ciao Marcoff ti devo chiedere se riesci a modificarlo entro giovedi perchè devo sostenere l'esame.
Lo so che insisto ma tu sei la mia unica speranza.
ciao.
Marcoff ti mando il codice come lo modificato quando lo mandato al prof. (https://www.forumzone.it/images/misc/attach_legacy.gif) (https://www.forumzone.it/attachment_legacy.php?dir=Gesux&file=2007619113128_main.zip)
cercherò entro stasera....;)
Grazie mille Marcoff
hey gesux, io non penso di farcela... domani sera devo partire e ho troppe cose da fare, coinvolgi benna in questa cosa, lui è molto bravo.
Mi dispiace ma sto troppo incasinato per la partenza.:(
Questo messaggio è stato aggiornato da marcoff il 19/06/2007 alle ore 22:18:11
Mi spiace veramente ma ho avuto tempo di visitare il forum solo stasera e non credo di riuscire a darti una mano in tempo per l'esame...:(
Spero che tu riesca a passarlo ugualmente :)
Benna il mio esame è stato rinviato a martedi perchè il prof è in malatia quindi ho ancora tempo.
Mi protresti dare una mano ugualmente?
Ciao
Ok, per martedì dovrei trovare il tempo di darti una mano
ok mille grazie
Ragazzi da Milano sono proprio intasatissimo, non ho neanche il tempo di un caffè.:(
Spettacolo marcoff
Spettacolo???????????????
What means?:eek:
Ecco qua ;)
(https://www.forumzone.it/images/misc/attach_legacy.gif) (https://www.forumzone.it/attachment_legacy.php?dir=benna&file=2007623125516_programma.zip)
ciao benna il programma va ma mi da un'errore nella conversione delle frasi:
Ad esempio:
file di imput :luigi ha la macchina
lo converto con :ciao
file di output: ciao
quindi la conversione non me la fa.
Ho provato sia con la mia sia con la versione originale di Marcoff e mi sono accorto che non trova mai nessuna occorrenza delle stringhe
A questo punto l'errore è nella funzione sostituisci
Benna però funziona quella fatta da marcoff per quanto riguarda la singola stringa.
Ma tu hai scaricato quella che ho messo io nel mio post cioè dove ho sritto
"Ciao Marcoff ti devo chiedere se riesci a modificarlo entro giovedi perchè devo sostenere l'esame.
Lo so che insisto ma tu sei la mia unica speranza.
ciao.
Marcoff ti mando il codice come lo modificato quando lo mandato al prof."
Quindi benna non riesci a correggerlo?
ciao
posta il codice Gesux che diamo un occhiata...;)
Marcoff non ti preoccupare ho risolto.
Grazie ancora per il tuo aiuto e anche quello di benna.
Ciao
Si ho scaricato il codice che hai allegato in quel post e lo ho modificato;
La cosa strana è che ho provato a compilare il codice inviato da Marcoff ma non funzionava neppure quello, forse il problema era nel mio pc
Dove era l'errore?
Era nella funzione sostituisci.
Benna cmq ti ringrazio per il tua aiuto.
Volevo fare un ringraziamento a tutti di questo forum perchè è stato il primo ad aiutarmi.Ma devo soprattuto ringranziare Marcoff per il suo supporto ma anche benna per il suo aiuto.
Grazie Ragazzi.
Questo messaggio è stato aggiornato da Gesux il 26/06/2007 alle ore 22:57:04
Si fa quel che si può, mi dispiace non averti aiutato fino in fondo, purtroppo sono un pò incasinato, almeno cosi hai appreso qualcosa di più.
Benna: il mio codice funzionava :diablo::diablo::diablo::diablo::D
Di niente Gesux ;)
P.S.
CitazioneEra nella funzione sostituisci.
...che io non ho modificato...
Va bè sicuramente l'avrà modificata Gesux, e poi io non ho testato...;).
Benna organizziamo qualcosa qua dentro....:D :D
Coasa vogliamo organizzare marcoff?
parlavo con benna per organizzare qualcosa per ravvivare un pò questa sezione...;)
Ora non ne ho proprio il tempo; ne riparleremo in futuro ;)