Newsgroup: it.comp.lang.c
Titolo: ulteriore richiesta di aiuto

Salve, sono un newbie e con questa richiesta credo di raccogliere parecchie
istanze.
Cerco indirizzi, how-to, tutorials, libri o codice in C per leggere un file
ascii e ricavare dati.
Mi spiego meglio, tutti noi conosciamo, bene o male fscanf() e similari, ma
non sono riuscito a trovare a nessuna parte una trattazione completa su come
si legge un file ascii, la gestione di errori, l'uso di una formattazione
non troppo rigorosa da parte di un utente, ecc.
Ho cercato, in verità, di estrarre queste informazioni anche da qualche
programma FEM (FELT, TOCHNOG, ecc.) che usano proprio i file ascii per
l'imput dei dati, ma sinceramente non sono stato capace di estrapolare il
codice in questione.
Per ciò, chiedo a tutta la comunità di aiutarmi(ci) indicandoci tutte le
info sull'argomento, anche vostri semplici accorgimenti.
Penso che questo sia un thread interessante!!
Saluti a tutti :-)
--
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::  .~.                                                 ::
::  /V\   LINUX      Angelo Massimo Figundio            ::
:: /(_)\  USER       
http://www.figundio.com
            ::
::  ^ ^              figundioam@ 
tiscali.it
             ::
::                                                      ::
:::::::Message released under the GNU/GPL license:::::::::

 non troppo rigorosa da parte di un utente, ecc.
Temo di non aver capito cosa ti serva.
Se vuoi solo estrapolare caratteri da un file non e' che si incontrino
grandi difficolta'. Io di solito non uso fscanf ma fgetc per avere un
controllo maggiore su cio' che leggo, ma mi sembra di intuire che tu
voglia qualcosa di piu' particolare.
E cosa intendi per "formattazione non rigorosa"?
Ciao,
Riccardo
-----
www.sideralis.net
Software et similia

 ha scritto nel messaggio
news:pan.2002.12.05....@tiscalinet.it...


 leggere al programma.
Ciao Angelo.
int c,i;
int buffer[2][100];
while(c!=EOF){
	i=0;
	while((c=fgetc(fp))!=' ' && c!='=') {buffer[0][i]=c; ++i;} /*salva la prima parola
		fino a che non trova ' ' o '='  */
	buffer[1][i]='\0'
	if(c!='=') while((c=fgetc(fp))!='=');	scorre la riga finche' non trova
		'=', a meno che non l'avesse gia' trovato*/
	while((c=fgetc(fp)!=' ');	/*raggiunge l'inizio della prossima parola*/
	buffer[2][0]=c;	/*abbiamo ottenuto l'inizio parola dal precedente ciclo*/
	i=1;
	while((c=fgetc(fp))!='\n' && c!=' '){buffer[1][i]=c; ++i;} /*salvo il
		secondo campo*/
	buffer[1][i]='\0';
	/*infine controllo che non siano stati aggiunti altri spazi dopo il
		secondo campo*/
	while((c=fgetc(fp)!=' ' && c!=EOF);
	fseek(fp,-1,SEEK_CUR); /*mando indietro di uno perche' ho pappato
		l'inizio della prossima parola*/
	}
Non sono sicuro del controllo di uscita del ciclo, controlla tu (vedi se
e' infinito o meno).
Inoltre, io ho usato una sola variabile buffer, che viene sovrascritta ad
ogni iterazione del ciclo. O sfrutti cio' che contiene alla fine di ogni
ciclo, oppure crei una struttura di buffer e un array del tipo di quella
struttura, oppure ancora salvi tutto su un altro file formattato come vuoi
tu.
Spero vada bene.
Ciao,
Riccardo
---
http://www.sideralis.net
Software et similia

Angelo, la richiesta non sembra cosě impossibile,
spero di risolverti il problema,
l'ortografia la si corregge durante l'inserimento da tastiera,
usi la funzione gets() e ti cattura ogni carattere immesso compreso
spazi (ovviamente con la pressione INVIO accetta i caratteri perciň,
se vuoi gestire anche caratteri speciali devi usare eccezioni),
attenzione che il buffer di tastiera ha un limite,
implementare delle routine che scartano gli spazi o gestiscono delle
eccezioni sono facilmente implementabili, il codice č personalizzabile
dal programmatore,
comunque grazie ad una lettura consigliata ho trovato una
implementazione ( ringrazio Barninga e compagni per l'ottima
spiegazione ) molto buona per gestire l'interpretazione di stringhe su
array...
prova a vedere se ti piace e fai attenzione all'uso dei puntatori a
funzione ;)
/*****************************************************
#include <stdio.h>      // per printf() e gets()
#include <string.h>     // per strlen()
#define  MAXLIN    256
#define  NORMAL      0
#define  WAIT        1
#define  BAR         0
#define  NON_BAR     1
void main(void);
char *hideLetterInc(char *ptr);
char *sayLetterInc(char *ptr);
char *hideLetterNextLine(char *ptr);
char *sayBarLetterInc(char *ptr);
extern int nextStatus = NORMAL;
void main(void)
{
    static char *(*funcs[2][2])(char *ptr) = {// e' static perche' e'
        {hideLetterInc, sayLetterInc},       // dichiarato ed
inizializzato
        {hideLetterNextLine, sayBarLetterInc}// in una funzione
    };
    char line[MAXLIN], *ptr;
    int letterType;
    while(gets(line)) {
        for(ptr = line; *ptr; ) {
            switch(*ptr) {
                case '/':
                    letterType = BAR;
                    break;
                default:
                    letterType = NON_BAR;
            }
            ptr = (*funcs[nextStatus][letterType])(ptr);
        }
        printf("\n");
    }
}
char *hideLetterInc(char *ptr)  // non visualizza il carattere e
restituisce
{      // il puntatore incrementato (tabella[0][0])
    extern int nextStatus;
    nextStatus = WAIT;
    return(ptr+1);
}
char *sayLetterInc(char *ptr)   // visualizza il carattere e
restituisce il
{      // puntatore incrementato (tabella[0][1])
    extern int nextStatus;
    nextStatus = NORMAL;
    printf("%c",*ptr);
    return(ptr+1);
}
char *hideLetterNextLine(char *ptr)// non visualizza il carattere e
{      // restituisce l'indirizzo del NULL
    extern int nextStatus; // terminator (tabella[1][0])
    nextStatus = NORMAL;
    return(ptr+(strlen(ptr)));
}
char *sayBarLetterInc(char *ptr)// visualizza il carattere preceduto
da una
{      // barra e restituisce il puntatore
    extern int nextStatus; // incrementato (tabella[1][1])
    nextStatus = NORMAL;
    printf("/%c",*ptr);
    return(ptr+1);
}
*****************************************************/
bye duido

 nome =           Angelo
Ti sconsiglio caldamente il dare la possibilita' di scrivere il file nel
primo modo. Il codice si complicherebbe molto, a meno di non introdurre
altre restrizioni (tipo un ';' dopo ogni coppia o qualcosa del genere)
Con il secondo tipo di scrittura la presenza o meno di spazi tra le coppie
"variabile valore" all'inizio o alla fine non complica molto la vita.
Purtroppo ora non sono alla mia macchina e non ho un comilatore sotto mano,
se ti interessa il codice per la seconda forma di file posso spedirtelo
(dovrei averlo gia' pronto da qualche parte).
Per interpretare secondo certi criteri dei file di testo si usa bison
(o si dovrebbe usare bison :-)), ne esiste una versione anche per windows.
Se hai del tempo per studiartelo (molto tempo, visto che non e' proprio
user friendly)
http://www.gnu.org/manual/bison-1.35/bison.html
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ragazzi, che dire ... sono commosso :')
Grazie a tutti, mi avete dato tutti tantissimi spunti per risolvere il mio
problema!!!
Sarebbe ora che qualcuno cominciasse a redigere le FAQ di questo news!!
Saluti a Tutti
--
Angelo M. Figundio
figun...@tiscali.it
www.figundio.com
***********************************************
E il mio signore lo sa
una sola volta non basterà
che l'avvoltoio divori il mio corpo
per far tacere per sempre il mio cuore
(A. Branduardi)
*******************************************
"Angelo Massimo Figundio" <figundi...@windNOSPAM.it> ha scritto nel
messaggio news:gNYH9.63267$2B1.1...@twister2.libero.it...
