Newsgroup: it.comp.lang.c
Titolo: AIUTO!!! Stringhe nei file!!! AIUTO!!!

Salve a tutti! Io ho un problema: devo leggere alcuni dati da un file. I
dati sono così formattati:
testo1    "testo1 testo1 testo1 testo1"
testo2    "testo2 testo2 testo2 testo2"
testo3    "testo3 testo3 testo3 testo3"
In questo modo, appena aperto il file, ed eseguendo fscanf(), ottengo
ovviamente testo1. Quello che mi serve dopo è leggere il testo tra parantesi
("testo1 testo1 testo1 testo1") all'interno di una sola variabile. Non posso
modificare il file in modo che sia "testo1_testo1_testo1_testo1" (che
effettivamente risolverebbe il problema) perchè il programma dovrà lavorare
con diverse centinaia di file di questo tipo. Quello che mi servirebbe è una
funzione che leggerebbe il testo compreso tra parentesi e lo restituirebbe
in formato char. Se qualcuno di voi è capace di questo miracolo mi
salverebbe dal suicidio! CIAO!!!


 Esagerato!
Il fatto che conosci gia' il formato dei file ti facilita moltissimo il
lavoro!
Dovresti crearti una funzione che ti legge il file e che carica tutte le
stringhe in memoria.
Secondo me ti conviene stabilire un carattere divisore, che ovviamente non
puo' essere usato
nelle strighe..
Per Es, usando | come carattere divisore:
TESTO1|testo1 testo1 testo1
TESTO2|testo2 testo2 testo2
ti fai una funzioncina che legge i caratteri dal file,uno ad uno; quando
incontra
il carattere divisore o \n, interrompe la lettura e memorizza il buffer in
un altra variabile...
È molto + semplice a farsi :)
Ph.

Ed aggiungo:
potresti crearti un tipo
struct
{
char * Nome;
char * Testo;
} typedef VOCE;
ti risulterebbe comodo per la memorizzazione..
Phones

Ciao!
Certo è tutto molto bello! Purtroppo (e credo di averlo scritto mi sembra)
non posso modificare le diverse decine di file TXT contenenti circa 4000
righe ogniuno (mi ci vorrebbero mesi). inoltre questi file vengono creati da
terze persone (il software che sto creato è su commissione) e non posso
modificarli: è antiprofessionale!
Altrimenti ci avevo già pensato io! cmq ti ringrazio per la disponibilità,
magari vedrò se riesco suicidarmi o vedere qualche tutorial... anche se non
ho trovato niente (tra l'altro l'idea della struttura non è affatto da
scartare visto che l'ho adottata già ma non riesco a finire quel piccolo
pezzo di codice....)
CIAO! (Grazie per lo scomodo :) )!!!!!
<Nob...@Noland.no> ha scritto nel messaggio
news:b1hnh1$jgn$1...@lacerta.tiscalinet.it...


 parantesi ("testo1 testo1 testo1 testo1") all'interno di una sola
non ho capito se e' tra virgolette o parentesi, cmq potresti fare una
cosa del genere
FILE *h;
char cbuff[1024],temp[1024];
char *p;
h=fopen("testo.txt","r");
if(h==NULL) return 0;
while(!feof(h))
{
 if(fgets(cbuff,1023,h)==NULL)
    break;
 p=cbuff+strlen(cbuff)-1;
 if(*p=='\r'||*p=='\n')
   *p=0;
 sscanf(cbuff,"%s \"%[^\"]",temp,temp); /* se e' tra "" */
 printf("%s\n",temp);
}
fclose(h);
se e' tra ()
sscanf(cbuff,"%s (%[^)]",temp1,temp2);
-- 
-=[]=---iAN CooG---=[]=-

("testo1 testo1 testo1 testo1") all'interno di una sola variabile.
#include <stdio.h>
#include <ctype.h>
int readfile(FILE *p)
{
     char s[128];
     int state = 0;
     while (fgets(s, sizeof s, p))
     {
           int i, flag_ok, s1idx, s2idx;
           char s1[128], s2[128];
           flag_ok = 0;
           s1idx = 0;
           s2idx = 0;
           for (i = 0; s[i]; i++)
               if (s[i] == '\n') s[i] = ' ';
           for (i = 0; s[i]; i++)
           {
               switch (state) {
                 case 0: { if (isalnum(s[i])) {
                              s1[s1idx++] = s[i];
                              state = 1;
                           }
                           break;
                         }
                 case 1: { if (isalnum(s[i]))
                              s1[s1idx++] = s[i];
                           else
                           {
                              s1[s1idx] = 0;
                              state = 2;
                           }
                           break;
                         }
                 case 2: { if (s[i] == '\"')
                              state = 3;
                           break;
                         }
                 case 3: { if (s[i] == '\"')
                           {
                              s2[s2idx] = 0;
                              state = 9;
                           }
                           else
                              s2[s2idx++] = s[i];
                           break;
                         }
                 case 9: { flag_ok = 1;
                           break;
                         }
               }
           }
           if (flag_ok)
           {
              printf("s1 = \"%s\", s2 = \"%s\"\n", s1, s2);
           }
           else
           {
              fprintf(stderr, 
                      "errore durante scomposizione: %s\n", 
                      s);
              return 0;
           }
     }
     return 1;
}
int main()
{
    int r;
    FILE *fp = fopen("tuofile.txt", "rt");
    if (fp == NULL)
    {
       fprintf(stderr, "error opening input file\n");
       return 1;
    }
    r = readfile(fp);
    fclose(fp);
    if (r)
       printf("...OK !...\n");
    else
    {
       fprintf(stderr, "...ERROR !...\n");
       return 1;
    }
    return 0;
}
-- 
Andrea Laforgia
#exclude <windows.h>