Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it L'avatar di HIEI
    Registrato dal
    Mar 2003
    Messaggi
    253

    [c++]espressioni regolari

    Ciao a tutti.

    Partendo da un file .ini tipico di windows

    codice:
    [titolo]
    parametro=valore
    devo estrapolare i vari valore e metterli in un array per poi parsarli in xml. Ora, sapendo che le regexp non sono supportate, qual'è il metodo più comodo (e corretto, visto che non son riuscito a farlo funzionare) per estrapolare questi benedetti dati?

    Grazie a tutti.
    steno983@azeroth Ubuntu 9.04 2.6.28 Gnome 2.26.1

    /home sweet /home

  2. #2
    Utente di HTML.it L'avatar di HIEI
    Registrato dal
    Mar 2003
    Messaggi
    253
    Ho fatto una cosa del genere, ma va in segmentation fault. Cosa sbaglio?

    codice:
    void gest_xml::parse_ini(){
    	int i,j,parola;
    	char *testa, *parametro, *valore;
    	parola = 0;
    	for(i=0; cfile[i] != '\0'; i++){
    		if(cfile[i] == '['){
    			for(j=0; cfile[i] != ']'; i++, j++){
    				testa[j] = cfile[i];
    			}
    			printf("%s\n",testa);	
     			for(j=0; cfile[i] != '='; i++, j++){
    				parametro[j] = cfile[i];
    			}
    			printf("%s\n",parametro);	
    			for(j=0; cfile[i] != '\n'; i++, j++){
    				valore[j] = cfile[i];
    			}			
    			printf("%s\n",valore);
    		}
    	}
    }
    steno983@azeroth Ubuntu 9.04 2.6.28 Gnome 2.26.1

    /home sweet /home

  3. #3
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Utente di HTML.it L'avatar di HIEI
    Registrato dal
    Mar 2003
    Messaggi
    253
    Forse mi sono spiegato male o non ho capito la tua risposta



    la mia idea è quella di avere un array contente parola per parola il file in input.


    Es:

    [titolo]
    par=val
    [titolo2]
    par2=val2


    Da questo file vorrei un array tipo questo

    arr[titolo][0]
    arr[par][1]
    arr[val][2]
    arr[titolo2][0]
    arr[par2][1]
    arr[val2][2]

    il valore di fianco è un indice che identifica il tipo di parola (titolo, parametro e valore).

    il codice deve essere multipiattaforma *nix/win.

    Il problema è che con il codice scritto da me vado in segmentation fault a causa dei puntatori.
    steno983@azeroth Ubuntu 9.04 2.6.28 Gnome 2.26.1

    /home sweet /home

  5. #5
    Originariamente inviato da HIEI
    Ciao a tutti.

    Partendo da un file .ini tipico di windows

    code:
    [titolo]
    parametro=valore



    devo estrapolare i vari valore e metterli in un array per poi parsarli in xml.
    ...
    Questa tua affermazione mi aveva tratto in inganno

    Riguardando il tuo codice :
    codice:
    void gest_xml::parse_ini(){
    	int i,j,parola;
    	char *testa, *parametro, *valore;
    	parola = 0;
    	for(i=0; cfile[i] != '\0'; i++){
    Vedo che dichiari i tre puntatori *testa, *parametro, *valore
    Ma non hai allocato la memoria!
    Puoi usare malloc() e realloc().

    Tipo :
    char*testa = (char*)malloc( sizeof(char)* 1000);
    per allocare i primi 1000 caratteri.
    se non fossero sufficienti puoi aumentare con la realloc().
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  6. #6
    Utente di HTML.it L'avatar di HIEI
    Registrato dal
    Mar 2003
    Messaggi
    253
    si vede che è tanto che non programmo in c++ . Mi era venuta anche un'altra idea: e se utilizzassi una lista?
    steno983@azeroth Ubuntu 9.04 2.6.28 Gnome 2.26.1

    /home sweet /home

  7. #7
    Originariamente inviato da HIEI
    si vede che è tanto che non programmo in c++ . Mi era venuta anche un'altra idea: e se utilizzassi una lista?
    Opss.. In C++ dovresti utilizzare new alposto di malloc().
    Potresti utilizzare una struttura tipo

    codice:
    #include <string.h>
    
    struct _INIKEY
    {
      string testa;
      string parametro;
      string valore;
    };
    
    int main()
    {
      _INIKEY *key;
    
    // Effettui una prima scansione del file .INI
    // per controllare quanti dati devi memorizzare
    // quindi imposti la dimensione dell'array *key
    // E procedi alla memorizzazione...
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  8. #8
    per prima cosa un saluto a tutti, questo è il mio primo post in questo forum, in cui mi sono imbattuto navigando e devo dire che mi piace.

    Io direi che se non conosci il numero di elementi che sono nel file, la cosa migliore è utilizzare una lista, cosi eviti di dover scansionare tutto il file per conoscerne la dimensione, o dover di volta in volta reallocare il vettore di dati (cosa abbastanza costosa dal punto di vista computazionale).

    Per cui ti consiglio di utilizzare la classe list della libreria stl

    ciao ciao

  9. #9
    Utente di HTML.it L'avatar di HIEI
    Registrato dal
    Mar 2003
    Messaggi
    253
    in effetti o deciso di utilizzare una lista, ma creata da me con una strutturda di questo tipo:

    codice:
    struct parole{
      char *parola;
      int  tipo_parola;
      parole *successivo;
    }parole;

    In realtà il mio problema in questo momento è riuscire a dividere il file di testo come serve a me... cioè prendere le parole tra [] e inserirle sapendo che è l'inizio di un blocco, ecc. per le altre parole.

    Idee?

    (Grazie a tutti)
    steno983@azeroth Ubuntu 9.04 2.6.28 Gnome 2.26.1

    /home sweet /home

  10. #10
    ciao...
    l'unica che mi viene... (considera anche l'ora a cui scrivo... ) è quella di leggere il file carattere per carattere e controllare se ognuno di essi corrisponde a [] nel qual caso fai quello che devi fare...
    O al max per limitare gli accessi al file potresti leggere ad esempio una stringa di una certa dimensione, metterla in un buffer temporaneo, e elaborare quella stringa cercando la presenza o meno di [].

    Ma in questi due casi dovresti essere tu a valutare quando termina una parola, controllando anche tutte le volte che si incontrano spazi o punteggiatura o parentesi ;:,() ecc

    ciao ciao

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.