Newsgroup: it.comp.lang.c
Titolo: cerco aiuto per stringa del c@##o!!!!!!!

struct libro{
	int codice_aut;
	char titolo[100];
	int anno;
};
void scrivi_testo(char nomefile[])
{
	char s [100];
	struct libro LIB;
	FILE *pf2;
		if((pf2=fopen(nomefile,"at"))==NULL){
			printf("impossibile leggere il file!\n");
			exit(1);}
		//inserimento dati
		printf("Inserisci il nuovo codice: ");
		scanf("%d",&LIB.codice_aut);
		printf("Inserisci il Titolo: ");
		gets(s);  // devo assegnarla alla struct!!!
		//SONO BLOCCATO QUI!!!!!!
		//scanf("%s",LIB.titolo); Se c'č uno spazio č finita!
		printf("Inserisci l'anno di pubblicazione (yyyy): ");
		scanf("%d",&LIB.anno);
		//scrittura dati
		fprintf(pf2,"%d %s %d\n",LIB.codice_aut,LIB.titolo,LIB.anno);
		fclose(pf2);
}

 ... ...

mi...@localhost.localdomain (Mimmo Simeone) wrote in message news:<slrnb8bqjq...@localhost.localdomain>...

nON funzioNA neanche con un puntatore a char.....
Quando arriva alla linea in cui si trova gets( line ), non esegue il
comando e salta alla linea di codice successiva.

Prova a fare una
fflush(stdin);
prima di ogni scanf e/o gets...

 file://scrittura dati


Mimmo Simeone wrote:

1) L'idea di pulire il buffer in input da eventuali "sporcizia" inserita in 
   momenti precedenti e' buona, ma non puoi farlo con fflush(stdin) perche' 
   e' undefined behaviuor e potrebbe ragionevolmente non funzionare. 
   Piuttosto fai un ciclo di lettura con delle getchar() finche' non 
   incontri la newline ('\n'), cosa che e' in pratica l'unico modo portabile 
   per farlo.
2) la gets e' deprecata perche' non effettua controlli sulla lunghezza 
   dell'input, meglio usare la fgets().
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

Non Ho ancora provato ma il codice di zero sembra molto interessante.
Domani vado in ufficio dal Gran Dott Ing che sicuramente risolvera il
problema in tempi non ragionevoli e vi farò sapere. Se qualcuno
volesse continuare a inviare soluzioni, ben vengano! Visto il traffico
per una gets()!!!!

Efettivamente la FLUSH come l'ha definita Mox funziona, ma rimane lo
stesso errore in lettura con la puts() che non so dove mettere
void leggi_testi(char nomefile[])
{
	//Qui non riesco a leggere titoli con gli spazi!
	int i=0;
	struct libro LIB[50];
	FILE *f;
	if((f=fopen(nomefile,"rt"))==NULL){
		printf("impossibile leggere il file!\n");
		exit(1);}
	while((fscanf(f,"%d\n %s\n %d\n",&LIB[i].codice_aut, LIB[i].titolo
,&LIB[i].anno))>0){
		printf("%d ", LIB[i].codice_aut);
		printf("%s",LIB[i].titolo);
		printf("  %d\n", LIB[i].anno);
		i++;}
	fclose(f);
}
I dati sono memorizzati in un file di testo del tipo
Codice
Titolo 
Anno uscita
Codice
Titolo
......

 exit(1);}
for(i=0; fscanf(f, "%d", &LIB[i].codice.aut) &&
     fgets(LIB[i].titolo, TITOLOLEN, f) && /*Attenzione! Fgets() legge anche
il '\n'*/
     fscanf(f, "%d", &LIB[i].anno);
     i++)


Non è proprio possibile distribuire i dati su righe?
cod_autore \t Titolo \t data??

void trova_testo()
{
	FILE* f;
	struct libro LIB[VETT];
	char s1[50];
	int i=0;
	int msg=0;
 
	printf("Inserisci il titolo: ");FLUSH;
	gets(s1); //deve prendere anche un \n, che non prende!!!!
	f=fopen("testi.txt","rt");
	while ((fscanf(f,"%d\n",&LIB[i].codice_aut))>0){
		fgets(LIB[i].titolo,VETT,f);
		fscanf(f,"%d\n",&LIB[i].anno);
		if (!strcmp(LIB[i].titolo,(s1 + '\n'))){
			//Qui sopra il titolo diferisce per un '\n'!
			printf("Trovato!: ");
			printf("%d ",LIB[i].codice_aut);
			printf("%s ", LIB[i].titolo);
			printf(" %d\n",LIB[i].anno);
			msg=1;}
		i++;}
	if (msg==0)
		printf("Non ho trovato nulla!\n");
	fclose(f);
}
Come aggiungo il \n alla stringa? strcat(s1,s2) non funziona!

 Come aggiungo il \n alla stringa? strcat(s1,s2) non funziona!
non capisco bene quale sia il tuo problema,
ma strcat(s,"\n") dovrebbe funzionare benissimo per
aggiungere la stringa "\n" in coda alla stringa s.
In che senso strcat non funziona ?
g.

 }
Saluti.