Newsgroup: it.comp.lang.c
Titolo: fgets o strcmp: cosa non funziona ?

Devo implementare una funzione che prende una stringa di testo,
controlla all'interno di un file il numero di occorrenze.
Ho fatto in questo modo:
void cercaStringInFile("input.txt", "stringa");
//--------------------------------------------------------------------------------------------------------------
if ((inputFile = fopen(fileName, __OPEN_READ__)) != NULL)
{
	while(!(feof(inputFile)))
	{
		string = malloc(sizeof(char *));
		fgets(string, 180, inputFile);
		   if (strcmp(str, (fgets(string, 180, inputFile))))
			stringCount++;
	}
			printf("Il numero di stringhe e': %d\n", stringCount);
}
//--------------------------------------------------------------------------------------------------------------
L'unico problema è che non funziona.

L'unico problema è che non funziona.
Non compila nemmeno, lo credo che non funziona.
Prova a produrre qualcosa di almeno compilabile e un pò più ragionato.
Ci sono un'infinità di errori.
--
Giorgio Silvestri
DSP/Embedded/Real Time OS   Software Engineer

 L'unico problema è che non funziona.
Considera che "non funziona" e' molto vago... sarebbe meglio se ci 
dicessi esattamente che errore ti da (errore in compilazione, 
segmentation fault a runtime, ecceterea) oppure che cosa non va come 
vorresti, a quel punto diventa piu facile aiutarti!
ciao
Giacomo

 		   if (strcmp(str, (fgets(string, 180, inputFile))))
Anche questo non ha senso.  Innanzitutto compi una seconda fgets() e poi
non stai testando tra loro le stringhe.  Considera anche che un ritorno
positivo di strcmp() significa differenza, non uguaglianza:
if (!strcmp(str, string)) {
....
}
Ti consiglio di sfogliare un buon manuale ;)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 while (fgets(s, sizeof s, inputFile)) {
p.s.: fgets() legge anche '\n' nel caso ci sia, quindi dopo la lettura è
bene fare un ciclo del genere:
for (i=strlen(s)-1; i>=0; i++) if (s[i] == '\n') { s[i] = '\0'; break; }


Il prototipo della funzione è il seguente
void countString(char *fileName, const char  string[]);
int stringCounter = 0;
...
if ((inputFile = fopen(fileName, "r")) != NULL)
{
	while(!feof(inputFile))
	{
		fgets(stringInFile, __BUFFER__, inputFile);
			if (strcmp(string, stringInFile))
				stringCounter++;
	}
}
...
Se provo a stampare a video il contenuto del file, utilizzando
fprintf(stdout, "%s", stringInFile);
funziona tutto a dovere.
Il problema è, secondo me, la strcmp. Se le due stringhe sono uguali,
dovrebbe resituire zero o no ?
La fgets legge dal file di input le stringhe e le mette in
stringInFile. Questa lettura viene eseguita fino al raggiungimento
della fine del file !

Ho fatto in questo modo e sembra funzionare:
void countString(char *fileName, const char string[], unsigned int
stringLen)
{
	char stringInFile[__BUFFER__];
	int stringCounter = 0;
	FILE *inputFile;
		if ((inputFile = fopen(fileName, "r")) != NULL)
		{
				while(!feof(inputFile))
				{
					fgets(stringInFile, __BUFFER__, inputFile);
						if (!strncmp(string, stringInFile, stringLen))
							stringCounter++;
				}
		}
		else
		{
			fprintf(stderr, "Impossibile aprire il file.\n");
			exit(-1);
		}
	printf("%d\n", stringCounter);
}
Qualcuno potrebbe indicarmi verso cosa devo indirizzarmi per
comprendere meglio questo affascinante linguaggio ? Grazie a tutti.

 stringInFile.
..mettendoci anche un '\n' finale, se c'è spazio, come ti ho già detto.
In questo caso, il confronto tra 'pippo\n' e 'pippo' fallirebbe.


Il codice dell'ultimo post funziona.
Andrea Laforgia ha scritto:


 Il codice dell'ultimo post funziona.
Il codice del tuo ultimo post, per quanto vedo, ancora non tiene conto del
fatto che potresti leggere 'pippo\n' e confrontarlo con 'pippo'.
Dire che un codice funziona č un azzardo bello e buono (Dijkstra docet);
semmai compila ;-)


 Dire che un codice funziona è un azzardo bello e buono (Dijkstra docet);


 controllo che mi hai suggerito te mi va in Segmentation fault.
Io non ti ho detto di aggiungere alcunché, semmai di rivedere quello che
già c'è ed eventualmente cambiarne totalmente la struttura.  T'assicuro
che ciò che ti ho suggerito è corretto.
Il codice seguente (scritto al volo, non compilato), dovrebbe funzionare
correttamente:
#include <stdio.h>
#include <string.h>
int main()
{
    char s[128]={0}, string_to_find="andrea";
    FILE *fp=fopen("pippo.txt", "rt");
 
    if (fp != NULL) {
       int count=0; 
       while (fgets(s, sizeof s, fp)) {
          int len=strlen(s);
          if (s[len-1]=='\n') s[--len]='\0';
          if (!strcmp(s, string_to_find))
            ++count;
       }
       printf("occorrenze: %d\n", str_count);
    }
    else fprintf(stderr, "impossibile aprire il file");
}
p.s.: quota correttamente per cortesia: sotto il testo e non sopra e
riportando solo il testo necessario del messaggio a cui rispondi.


Vedi questo:
		if ((inputFile = fopen(fileName, __READ_ONLY__)) != NULL)
		{
				while(!feof(inputFile))
				{
					fgets(stringInFile, sizeof(stringInFile), inputFile);
						for (i = 0; i < strlen(stringInFile); i++)
								if (stringInFile[i] == '\n')
								{
									stringInFile[i] = '\0';
									break;
								}
						if (!strncmp(string, stringInFile, stringLen))
							stringCounter++;
				}
		}
Andrea Laforgia ha scritto:


 Vedi questo:
Non riporti come hai dichiarato stringInFile.  E' fondamentale saperlo.
L'uso di sizeof infatti ha senso solo nel caso quella variabile sia un
array, NON nel caso in cui sia un puntatore.
p.s.: QUOTA CORRETTAMENTE.


Si è un array di caratteri
char stringInFile[DIMENSIONE];
Scusatemi ma sono alle prime armi. Potreste consigliarmi qualche
risorsa per entrare un poco nelle cose avanzate ?
Vi ringrazio per tutto !
Andrea Laforgia ha scritto:


 risorsa per entrare un poco nelle cose avanzate ?
Be', queste non sono cose "avanzate" ;-)
Ribadisco, comunque, che il codice che ti ho postato funziona.


Mi è stato consigliato di programmare e programmare al fine di
imparare il più possibile. Però se non sto con qualche progetto in
mano, o meglio, non so che problema affrontare e qualcuno o qualcosa
che mi aiuta a correggermi non so proprio dove andare.
Andrea Laforgia ha scritto:


 che mi aiuta a correggermi non so proprio dove andare.
Lo capisco, ma qui dentro di spunti per correggere ne hai avuti parecchi.
Il gruppo di discussione è un buon luogo per imparare, ma se ti va di
partecipare a progetti veri, puoi consultare l'archivio di progetti di
SourceForge (
http://sf.net
).  Ci sono molti progetti in molti linguaggi,
tra cui anche il C.


 for (i=strlen(s)-1; i>=0; i++) if (s[i] == '\n') { s[i] = '\0'; break; }
Nitpick: Se il newline è presente è necessariamente l'ultimo carattere
della stringa, non è necessario scorrerla tutta ;)
Luca
-- 
Home: 
http://kronoz.cjb.net
Inquietudine sintetica
Solo, davanti all'ignoto
Tienimi stretto a te

 imparare il più possibile.
Impara anche a quotare...
http://www.xs4all.nl/~hanb/documents/quotingguide.html
Luca
-- 
Home: 
http://kronoz.cjb.net
Windows NT crashed.
I'm the Blue Screen of Death.
No one hears your screams.

 della stringa, non è necessario scorrerla tutta ;)
Right ;)
Infatti nell'altro messaggio faccio riferimento solo all'ultimo carattere.


 Infatti nell'altro messaggio faccio riferimento solo all'ultimo carattere.
Sorry, m'è partito un messaggio con l'altro account ;)


 Right ;)
Lo so che lo sai ;)
<ot>
Visto che l'indirizzo email non è valido...
Il mio messaggio originale era in UTF-8, il tuo news reader ha mantenuto
le lettere accentate "as is", ma ha messo:
Content-Type: text/plain; charset=ISO-8859-1
molto male...
</ot>
Luca
-- 
Home: 
http://kronoz.cjb.net
Ci sono due cose che l'uomo non puo` nascondere:
essere ubriaco ed essere innamorato.

 le lettere accentate "as is", ma ha messo:
Eh.. lo so, ma te la devi prendere con quelli di newsland ;-)... scrivo le
mie risposte via web...
