Newsgroup: it.comp.lang.c
Titolo: Leggere da un file

Salve a tutti,
avrei bisogno di creare un programma in C che riesca a leggere da un file ed
eseguire delle operazioni in base se trova una data parola bnel file.
Ad esempio, se nel file c'č scritto "cane" il programma deve stampare sullo
schermo "gatto", poi deve proseguire la ricerca di altre parole
Č possibile? Se si come?
Anticipatamente ringrazio.
Vanni


Davanti ad una cosa del genere (in pascal...il C l'ho appena iniziato :p)
creerei un insieme di caratteri dove metterei le lettere dell'alfabeto, poi
scandirei carattere a carattere il file:
1.se
 trovo un carattere lettere lo aggiungo in una variabile stringa (vuota
o con altri caratteri già dentro) e ripeto 1.
2.se
 trovo un carattere non lettera interrompo la procedura e analizzo la
stringa memorizata
3.reinizializzo la stringa e riparto da 1.
ciao ciao

Č possibile? Se si come?
<CODE>
#include <stdio.h>
#include <string.h>
int main()
{
    char line[1024], *p;
    while (fgets(line, sizeof line, stdin))
    {
          for (p = strtok(line, " ");
               p;
               p = strtok(NULL, " "))
          {
              if (strcmp(p, "cane") == 0)
              {
                 printf("gatto ");
              }
              else
              {
                 printf("%s ", p);
              }
          }
          printf("\n");
    }
    return 0;
}
</CODE>
-- 
The Follet

Ciao a tutti,
ho analizzato la source di The Follet e più o meno ho capito cosa esegue. Ma
non ho capito bene come fa a puntare ad un file, nella source il programma
punta al file "p" ?
Scusate le domande ma sono ancora principiante in queste cose riguardanti l'
IO e i files. =)
Grazie

 </CODE>
   Questo programma non e` del tutto esatto: non riconosce... i cani 
immediatamente prima del fine-riga e duplica inutilmente questi ultimi. 
Infatti, ad un input del tipo
	1. poppo cane pippo
	2. pluto poppo cane
	3. cane puppo
	4. pluto cane
	5. peppo closo
	6.
replica con un output come il seguente:
	 1. poppo gatto pippo
	 2.
	 3. pluto poppo cane
	 4.
	 5. gatto puppo
	 6.
	 7. pluto cane
	 8.
	 9. peppo closo
	10.
   In effetti, la questione e` molto piu` complessa e, IMHO, va risolta 
a piu` basso livello, con un rudimentale analizzatore lessicale:
<code>
	#include <ctype.h>
	#include <stdio.h>
	#include <string.h>
	int
	main(void)
	{
		char word[80];
		int input,i,cursor=0;
		/* erase the content of the auxiliary string */
		for(i=0;i<80;i++) *(word+i)='\0';
 
		while((input=fgetc(stdin))!=EOF) {
 
			if(isspace(input)) {
				/*
				 * prints the entire word, choosing
				 * if to do the substitution
				 */	
				if(strcmp(word,"cane")) printf(word);
				else printf("gatto");
				/*
				 * outputs the space and tidies up
				 * all
				 */
				fputc(input,stdout);
				cursor=0;
				for(i=0;i<80;i++) *(word+i)='\0';
			}
			else {
				/*
				 * remembers the character for
				 * futher uses
				 */
				*(word+cursor)=input;
				cursor++;
			}	
 
		}
 
		return 0;
	}
</code>
-- 
Alla prossima,
Marco

a piu` basso livello, con un rudimentale analizzatore lessicale:
Non serve, basta aggiungere il new-line o qualsiasi altro
carattere che puo' fare da separatore e l'output e'
corretto:
<CODE>
include <stdio.h>
#include <string.h>
int main()
{
    char line[1024], *p;
    while (fgets(line, sizeof line, stdin))
    {
          for (p = strtok(line, " \n\t");
               p;
               p = strtok(NULL, " \n\t"))
          {
              if (strcmp(p, "cane") == 0)
              {
                 printf("gatto ");
              }
              else
              {
                 printf("%s ", p);
              }
          }
          printf("\n");
    }
    getchar();


 corretto:
   In realta`, quello che volevo sostenere e` che la strtok() sarebbe da 
abbandonare: a proposito dei "dubbi sulle stringhe e vulnerabilita`"... :)
-- 
Alla prossima,
Marco

 source il programma punta al file "p" ?
p punta alla parola corrente. Per leggere le righe viene usata la
funzione:
fgets(line, sizeof line, stdin)
nell'esempio postato il file utilizzato e` stdin (lo standard input).
Se vuoi leggere da un file:
FILE *myfile;
myfile = fopen("nomefile", "r");
if (myfile == NULL) {
	/* Errore *
}
fgets(line, sizeof(line), myfile)
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Sono un mirabile incrocio tra Tarzan e Giacomo Leopardi.
In me convivono tutte le doti intelluttuali di Tarzan e
tutta la prestanza fisica di Giacomo Leopardi.
A. Borsani

Se vuoi leggere da un file:
<snip>
Se si vuol leggere da un file, basta dirigere l'input
tramite l'operatore <, valido sotto Windows/DOS che sotto
Unix/Linux :
nomeprogramma < tuofile.txt
-- 
The Follet