Newsgroup: it.comp.lang.c
Titolo: scanf Riconoscere fine linea

Salveo ho un problema:
ho un file (fp) e voglio leggerne parola per parola, copiando mano a
mano su fp2 tutte le parole diverse da una certa chiave.
il problema è che non so come fare a riconoscere quando sono arrivato
a fine riga e fare in modo di aggiungere "\n" su fp2.
Vi allego la parte di codice:
        while(fscanf(fp, "%s", line) != EOF){
                if (line != chiave){
                         fprintf(fp2, line);
                }
        }
Grazie anticipatamente a chiunque fosse in grado di risolveere questo
mio problema.

 mio problema.
La specifica di stringa "%s" ignora tutti gli spazi bianchi, e il
carattere '\n' č considerato anch'esso uno spazio bianco.
Puoi definire una specifica di stringa personalizzata con "%[...]" dove al
posto dei tre puntini metti un'espressione regolare che definisce quali
caratteri possono parte della stringa. Ma in questo caso non credo ti sia
molto utile.
Secondo me la cosa piů semplice č lasciar perdere la fscanf() e scriverti
la tua funzione che legge una parola. Esempio:
bool leggiParola (FILE * f, char * p)
{
   int c = getc(f);
   switch (c)
   {
      case EOF:
         return false;
      case '\n':
         p[0] = '\n';
         p[1] = '\0';
         return true;
      case ' ':
      case '\t':
         do
         {
            c = getc(f);
            if (c == EOF)
               return false;
         }
         while (c == ' ' || c == '\t');
         break;
   }
   do
   {
      *p++ = (char)c;
      c = getc(f);
   }
   while (c != ' ' && c != '\t' && c != '\n' && c != EOF);
   ungetc(f, c);
   *p = '\0';
   return true;
}
Non ho assolutamente testato il codice. Inoltre, sarebbe molto meglio
passare alla funzione la dimensione del buffer "line" e controllare che la
lunghezza della stringa letta non lo superi.
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:9f885739.05012...@posting.google.com...

Io leggerei 1 riga alla volta (fgets) e poi le parole le prendi dalla riga
(sscanf). Il confronto tra stringhe si fa con la strcmp.
#define MAXRIGA 1024
char riga[MAXRIGA];
/* ciclo di lettura delle righe */
while (fgets(riga, MAXRIGA, fp) != NULL) {
    /* ciclo di lettura delle parole*/
    while (sscanf(riga, "%s", parola) != EOF) {
        if (strcmp(parola,chiave) != 0) fprintf(fp2,"%s ",parola);
    }
    /* metto l'a-capo */
    fprintf(fp2,"\n");
}
1) Codice non testato. 2) Mancano un po' di dichiarazioni 3) MAXRIGA deve
essere maggiore della lunghezza massima delle righe di fp
A parte questo dovrebbe andare...
Ciao,
Ema

         if (strcmp(parola,chiave) != 0) fprintf(fp2,"%s ",parola);
oops. questo "while (sscanf...)" legge la prima parola all
eternitate....
#include <stdio.h>
int main(void)
{
   const char *p="buon giorno";
   char parola[10];
   sscanf(p,"%s",parola); puts (parola);
   sscanf(p,"%s",parola); puts (parola);
   sscanf(p,"%s",parola); puts (parola);
   sscanf(p,"%s",parola); puts (parola);
   return 0;
}
-- 
Horst

 molto utile.
...
"%[^\n]"
e leggi tutto fino al newline (ovvero la riga).
Naturalmente e' sempre meglio "%N[^\n]"  con N intero opportuno per 
evitare buffer overflow.
Giorgio

 per evitare buffer overflow.
Ma non mi pare sia quello che ha chiesto. In ogni caso, quello che hai
descritto è il sistema per trasformare la fscanf() in fgets()...
--
Cingar

 eternitate....
Hai ragione. :같-(
E' che avevo semplicemente ed ingenuamente copiato il codice originale
sostituendo fscanf con sscanf...
In effetti io non avrei nemmeno usato la sscanf ma l'avevo rimessa in fretta
e furia x non cambiare troppe carte in tavola al nostro amico...
Comunque l'idea dell'intento dovrebbe essere chiara, ed e' questo
l'importante.
Scusate l'imprecisione e grazie della segnalazione.
Ema