Newsgroup: it.comp.lang.c
Titolo: gestione file txt

ciao a tutti,
premetto che sono un prg VB e dunque so molto poco di C :((((
vorrei un aiuto su come gestire i valori che pesco da un file txt....
allora il file si presenta in questo modo:
[M 20 65.0]
[F 18 50.5] commento
[M 20 65.0]
M 20 60.0]
ogni riga corrisponde a sesso,eta,peso
vorrei sapere come leggermi questi dati e assegnarli
a delle variabili....
per ora sono riuscito a fare questo:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define BUFFER 500
void LeggiFile()
{
 char riga[BUFFER];
 FILE *fp;
 char sesso;
 char eta;
 char peso;
 int i;
 //Apro il File in lettura
 fp=fopen("c:\\bc\\bin\\test\\dati.txt","rt");
 if (fp!=NULL)
 {
  while (fgets(riga,BUFFER,fp))
  {
    'Controllo se il record inizia per [ )
     if (riga[0]=='[')
      {
       sesso=riga[1];
       printf("%c ",sesso);
      }
  }
 }
 else
 {
  printf("%s","File non trovato!");
 }
 fclose(fp);
}
Ecco, sono proprio alle prime armi..... esiste un modo migliore per gestire
file txt????
cosi riesco a ricavare il "sesso" ma quando cerco l'eta o il peso che hanno
lunghezza variabile
( da 1 a max 3 char) tipo :
[M 110 65.0]
[F 2 9.5]
[F 19 150.5]
come posso fare PLZ AIUTO!!!!!!
Grazie a tutti!
ciauz
Fabio

 [F 19 150.5]
prova con fscanf.
il prototipo e':
int fscanf(FILE *stream, const char *format, ...);
nel tuo caso:
fscanf(fp, "%c %d %f", &sesso, &eta, &altezza);
naturalmente questo vale solo per una riga: se vuoi leggere tutto il file
ti conviene creare un array per il sesso, un array per l'eta' e uno per il
peso.e ovviamente mettere la fscanf all'interno di un ciclo while.
spero di esserti stato di aiuto ;)
ciao,
	Lorenzo

 spero di esserti stato di aiuto ;)
void LeggiFile()
{
 char ch;
 FILE *fp;
 char sesso;
 int eta;
 float peso;
 int fscanf (FILE *stream,    const char *format [sesso,eta,peso]);
 //Apro il File in lettura
 fp=fopen("c:\\bc\\bin\\test\\dati.txt","r");
 if (fp!=NULL)
 {
   fscanf(fp,"%c %d %f",sesso,eta,peso);
   printf("%c",sesso);
   printf("%d",eta);
   printf("%f",peso);
 }
Non capisco dove sbaglio.... da errore nel prototipo
puoi dirmi dov'è l'errore
ora è tardi forse e meglio che vado a dormire 8P
Grazie
Fabio

 l'errore
il prototipo indica il valore di ritorno di una funzione e il tipo degli
argomenti che vanno passati, praticamente e' quello che c'e' scritto su un
manuale se cerchi una funzione. non devi includerlo nel programma, io te
l'ho scritto solo per farti capire come andava usata la funzione. capito
cosa intendo?

 ha scritto nel messaggio
news:YkHX9.34199$lj5.3...@tornado.fastwebnet.it...


 devi scandire tutto il file.
ovviamente, pero' credo che Fabio intendesse richiamare la funzione
LeggiFile dall'interno del ciclo while nel main.. credo
ciao



cmq cosi' non funzionerebbe, probabilmente sarebbe meglio mettere tutto
dentro il ciclo while del main.. o fare attenzione a passare correttamente
le variabili alla funzione.

 Non capisco dove sbaglio....
Prova così
void LeggiFile()
 {
  char ch;
  FILE *fp;
  char sesso;
  int eta;
  float peso;
  fp=fopen("c:\\bc\\bin\\test\\dati.txt","r");
  while (!foef(fp))
  {
    fscanf(fp,"%c %d %f",&sesso,&eta,&peso);


Ovviamente ....quello che ho scritto va bene per il main....non per la funz.
leggifile
quindi mi correggo:
void main(){
  char ch;
  FILE *fp;
  char sesso;
  int eta;
  float peso;
  fp=fopen("c:\\bc\\bin\\test\\dati.txt","r");
  while (!foef(fp))
  {
    fscanf(fp,"%c %d %f",&sesso,&eta,&peso);
    printf("%c",sesso);
    printf("%d",eta);
    printf("%f",peso);
  }
}
--
Ringhio

Ovviamente ....quello che ho scritto va bene per il main....non per la funz.
leggifile
quindi mi correggo:
void main(){
  char ch;
  FILE *fp;
  char sesso;
  int eta;
  float peso;
  fp=fopen("c:\\bc\\bin\\test\\dati.txt","r");
  while (!foef(fp))
  {
    fscanf(fp,"%c %d %f",&sesso,&eta,&peso);
    printf("%c",sesso);
    printf("%d",eta);
    printf("%f",peso);
  }
}
--
Ringhio

 allora il file si presenta in questo modo:
fammi indovinare...ingegneria gestionale? :)
ciao
-- 
We are just like a sandglass, 
a life inserted by someone else into a glass, 
the time that has been given us it's brief, we can't stay shut in here, 
even at the cost of breaking the glass, we must go out.

 quindi mi correggo:
[CUT]
Io ho fatto cosi:
void LeggiFile()
{
	FILE *fp;
	char sesso;
	int eta;
	float peso;
	float altezza;
	fp=fopen("c:\\dati.txt","r");
	while (!feof(fp))
	{
		fscanf(fp,"%c %d %f,&sesso,&eta,&peso);
		if ((sesso=='M') || (sesso=='F'))
		{
			printf("\n");
			printf("%c\n",sesso);
		}
		if ((eta>-1) && (eta<121))
		{
			printf("\n");
			printf("%d\n",eta);
		}
		if ((peso>-1) && (eta<181))
		{
			printf("\n");
			printf("%f\n",peso);
		}		
	}
}
Con il file:
[M 22 65.0]
[F 28 85.0]
Perchè l'output è:
M
22
65.000000
22
65.000000
22
65.000000
F
28
85.000000
28
85.000000
perche????????????????????????
Grazie
ciao
fabio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 fabio
Prego
ciao
--
Ringhio

  fscanf(fp,"[%c %d %f]",&sesso,&eta,&peso);
Purtroppo fa un loop infinito.....
Grazie


 Purtroppo fa un loop infinito.....
Mi spaice ma non ho modo (adesso) di provarlo.
Mi mandi il file  C e il file dat in privato?
(Togli _xxx)
g.manne...@ads.it

a delle variabili....
Ti ho scritto un esempio, c'e` una funzione parse_string() che si
occupa di fare un'analisi dettagliata di quanto le viene passato, per
estrarre i dati che interessano.
Ad esempio, con un input di questo tipo:
+  [   M   20   60.5   ]
[ F 18 50.5] commento
   [M  25 70.22 s ]  commento
 [M 20 70]
[F 20 ]
restituisce l'output:
+  [   M   20   60.5   ] --> sesso = M, eta = 20, peso =  60.50
[ F 18 50.5] commento --> sesso = F, eta = 18, peso =  50.50
   [M  25 70.22 s ]  commento --> sesso = M, eta = 25, peso =  70.22
 [M 20 70] --> sesso = M, eta = 20, peso =  70.00
errore: [F 20 ]
Testa bene il programma, perche` non ho eseguito dei test approfonditi
e potrebbe nascondersi qualche bug.
<CODE>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int parse_string(const char *s,
                 char *sesso,
                 unsigned *eta,
                 double *peso)
{
     int res = 0;
     if (s) {
        int len = strlen(s);
        char *t = malloc(len+1);
        if (t) {
           int i = 0;
           int state = 0;
           while ((*s) && (*s++ != '['))
                 ;
           while ((*s) && (*s != ']')) {
                 switch (state) {
                    case 0: { if (isspace(*s))
                                 break;
                              state = 1;
                            }
                    case 1: { if (isspace(*s)) state = 0;
                              t[i++] = *s;
                              break;
                            }
                 }
                 ++s;
           }
           t[i] = 0;
           res = sscanf(t, "%c %d %lf", sesso, eta, peso) == 3;
           free(t);
        }
     }
     return res;
}
int main()
{
    FILE *f = fopen("file.txt", "rt");
    char s[50];
    if (f == NULL) {
       fprintf(stderr, "cannot open input file");
       exit(1);
    }
    while (fgets(s, sizeof s, f)) {
          char sesso;
          unsigned eta;
          double peso;
          int i;
          for (i = 0; s[i]; i++)
              if (s[i] == '\n')
                 s[i] = '\0';
          if (parse_string(s, &sesso, &eta, &peso)) {
             printf("%s --> sesso = %c, eta = %d, peso = %6.2lf\n",
                    s, sesso, eta, peso);
          }
          else {
             fprintf(stderr, "errore: %s\n", s);
          }
    }
    return 0;
}
</CODE>
-- 
Andrea Laforgia
#exclude <windows.h>

 Purtroppo fa un loop infinito.....
fscanf(fp,"[%c %d %f]\n",&sesso,&eta,&peso);
Cosě funziona...ho provato

 Cosě funziona...ho provato
Perfetto funziona!!!!
Grazie 1000!!!
Fabio


 e potrebbe nascondersi qualche bug.
[CUT]
Grazie 1000 anche a te!!
stasera provo a guardarlo bene.......
Ciao


 Fabio
--
Ringhio

 fammi indovinare...ingegneria gestionale? :)
penso di si 8P
una ragazza mi ha chiesto se potevo aiutarla ma io di C so poco e niente :(
sto provando a impostargli il programma......
ciao
FAbio


 e potrebbe nascondersi qualche bug.
Mi da quest'errore il compilatore C:
error C2440: 'initializing' : cannot convert from 'void *' to 'char *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast
Sai perche?
Grazie
Ciao
Fabio


Sai perche?
Perché evidentemente stai usando un compilatore C++ che richiede,
obbligatoriamente, il cast da void* a char* (dovrebbe essere la
malloc() eseguita su t).
Io ho compilato con Borland C++ Builder in modalità C (non C++) e non
ho avuto problemi.
Nel tuo caso, o cambi la malloc(), adeguandola ai requisiti C++:
t = (char*)malloc(len+1);
oppure dovrebbe bastare assegnare un'estensione .C (e non .CPP o .CC o
.CXX) al tuo sorgente e ricompilare.


salve
scusate se mi intrometto pero' ho sentito che hai settato il comp dell
borland in modalita c mi potresti dire come fare perche' io non ci sono
riuscito.
grazie molte
     saluti

 sto provando a impostargli il programma......
ah! la stessa cosa è capitata a me! con ben tre persone che volevano che
io gli scrivessi il programma! questi ingegneri non sanno proprio fare
niente :)


riuscito.
Ho usato il C++ Builder, ho creato una nuova applicazione console e il
sistema ti chiede se la vuoi generare in C o C++.  In ogni caso, la
modalità di compilazione si dovrebbe attivare automaticamente di un
tipo o dell'altro a seconda dell'estensione del modulo (.C per i
sorgenti C e .CPP o .CXX o .CC, a seconda del compilatore, per i
sorgenti C++).
