Ciao, sotto bozza del libro ho provato a completare e rendere funzionale un programma che legga le stringhe da un file di input e, nel caso una stringa del file di input contenga al suo interno una stringa digitata nel programma, scrivi tutte quelle stringhe in un file di output. Tuttavia ho varie anomalie.
Prima di tutto usando nella funzione puts, gli output a video escono 2 volte.
Seconda cosa, il modo in cui la funzione agisce mi sembra un po' random..
A quanto ho letto, fgets legge finchè il file di testo non è finito (quindi è inutile specificare la condizione !feof(*filein)), o finchè nel file di testo in input o in stdin non si va a capo rigo (\n), e in questo caso memorizza la stringa in un array che viene reinizializzato dopo ogni ciclo.
Quindi anche se ci sono spazi o parole attaccate con in mezzo o ai margini la parola cercata dovrebbe funzionare allo stesso modo..
Il codice è:
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#define OK 1
#define ERROR -1
#define MAXLINE 1000
int copiaselettiva (char refstr[]); //Prototipo
int main() {
char check[MAXLINE];
printf("Inserire stringa\n");
fgets(check, MAXLINE, stdin);
copiaselettiva(check);
printf("Valore di ritorno: %d",copiaselettiva(check));
return 0;
}
int copiaselettiva (char refstr[])
{
char line[MAXLINE];
FILE *fin, *fout;
if((fin=fopen("D:\\File\\filein.txt", "r")) == NULL)
{
return ERROR;
}
if ((fout=fopen("D:\\File\\fileout.txt", "w"))== NULL)
{
fclose(fin);
return ERROR;
}
/* fgets legge da filein al piu' MAXLINE-1 caratteri e assegna al vettore line i caratteri letti, incluso
* l'eventuale carattere di newline, e termina la stringa con il carattere \0 */
int n=1;
/* //A ogni ciclo prendo una stringa dal file puntato da fin, a partire dalla prima avanzando finchè non ne sono
* piu' rimaste, e le immagazzino in line */
while (fgets(line, MAXLINE, fin)!= NULL && !ferror(fin))
if (strstr(line,refstr)!= NULL) { //Se le stringhe tra quella cercata e quella nell'array non sono diverse
printf("%d stringa\n",n);
n++;
puts(line); // Stampo la stringa a video
fputs(line, fout); // Scrivo la stringa nel file di output
}
fclose(fin);
fclose(fout);
return OK;
}
Io come input nel programma do la stringa "ciao", senza virgolette.
Nel filein.txt ho
ciaomondo
Helloworld
ciao
mondociao
ciao ciao
ciao ciao Helloworld
ciaomondociao
mondociaomondo
ciao mondociao
mondociaomondo
A terminale viene stampato
Inserire stringa
ciao
1 stringa
ciao
2 stringa
mondociao
3 stringa
ciao ciao
4 stringa
ciaomondociao
5 stringa
ciao mondociao
1 stringa
ciao
2 stringa
mondociao
3 stringa
ciao ciao
4 stringa
ciaomondociao
5 stringa
ciao mondociao
Valore di ritorno: 1
Process finished with exit code 0
E ancora nel fileout.txt viene scritto:
ciao
mondociao
ciao ciao
ciaomondociao
ciao mondociao
Non riesco a trovare alcuna correlazione in tutto questo..
Grazie.