Pagina 1 di 1

effettuare la scansione di un text file in C

Inviato: ven 3 ott 2008, 15:13
da dark0s
Ciao a tutti, mho un problema serio riguardo la programmazione in linguaggio C.
Devo effettuare la scansione di un file di testo, ad esempio un file del tipo:

#Begin configuration file

OPTION1=...
OPTION2=...

#End configuration file

Devo leggere i valori delle variabili OPTION, ma devo effettuare tutto questo in linguaggio C.
Qualcuno sa darmi qualche dritta? Le provate tutte..., uso l'interfaccia standard ANSI C degli stream, ma non riesco a leggere neppure un rigo.

Grazie, e ciao

Re: effettuare la scansione di un text file in C

Inviato: ven 3 ott 2008, 16:36
da Blizzard
ciao,
perchè non posti il codice che hai scritto e vediamo di capire il perchè non funziona???

se poi vuoi qualcosa di gia pronto in tavola puoi dare un'occhiata al lettore di config file che ho fatto per una mezza shell che ho sviluppato
http://digilander.libero.it/bohshell/
li uso parecchio POSIX... ma quella parte dovrebbe essere facilmente convertita in ANSI

Gio

Re: effettuare la scansione di un text file in C

Inviato: ven 3 ott 2008, 16:40
da Blizzard
http://bohsh.cvs.sourceforge.net/viewvc ... iew=markup
di preciso è la prima funzione di questo file

Re: effettuare la scansione di un text file in C

Inviato: ven 3 ott 2008, 17:38
da dark0s
Il mio prototipo per ora è il seguente:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char* argv[]) {

int fd, d;
size_t lsize;
FILE* conf_file;
char * line = NULL;

if (argc == 1) {
printf("\nCommand syntax:\n");
printf("\n\tprogramd [ start | stop ]\n");
printf("\t\tstart: start daemon\n");
printf("\t\tstop: stop daemon\n");
}
else if (strcmp(argv[1], "start") == 0) {
conf_file = fopen("/etc/program/program.conf", "r");
if (conf_file == NULL) perror("File not open");
while (!feof(conf_file)) {
d = getline(line, lsize, "/etc/program/program.conf");
printf("%d\n", d);
printf("%s\n", line);
}
}

return(0);

}
Compilazione ed esecuzione vanno nel modo seguente:

bash-3.1# gcc programd.c -o programd
bash-3.1# ./programd

Command syntax:

programd [ start | stop ]
start: start daemon
stop: stop daemon
bash-3.1# ./programd start
-1
Segmentation fault
bash-3.1#

mentre il file di configurazione è il seguente:
# Begin configuration file

OPT=/etc/myprogram/myprogram.log

OPT=/etc/myprogram/myprogram.lock

# End configuration file

Re: effettuare la scansione di un text file in C

Inviato: ven 3 ott 2008, 18:06
da Blizzard
scusa ma hai fatto un po un casino

Codice: Seleziona tutto

conf_file = fopen("program.conf", "r");
		if (conf_file == NULL) perror("File not open");
		while (d = getline(&line, &lsize, conf_file)!=-1) {
			
			printf("%d\n", d);
			printf("%s", line);
			free(line);
			line=NULL;
		}
		fclose(conf_file);
man getline per vedere dove avevi incasinato nel chiamare la funzione... a partire dai puntatori sino allo stream del file

Gio

edit: ho cambiato il path del file per provarlo... rimetti il tuo
Ariedit:
1. CHIUDI I FILEEEEES!!!!!
2. un puntatore lo hai dichiarato type * var; un'altro type* var;
il modo generalmente migliore è type *var; :D
3. occhio a quando faccio la free e assegnamento NULL di line. È abbastanza importante

Re: effettuare la scansione di un text file in C

Inviato: ven 3 ott 2008, 18:48
da targzeta
dark0s ha scritto:...d = getline(line, lsize, "/etc/program/program.conf");...
Dal getline(3), il prototipo della funzione è:

Codice: Seleziona tutto

ssize_t getline(char **lineptr, size_t *n, FILE *stream);
quindi tutti e tre i parametri che gli passi sono sbagliati. I primi due perchè non gli passi dei puntatori, ma semplicemente la copia delle variabili, quindi getline non può lavorarci su. Il terzo perchè non è neanche del tipo richiesto (non che i primi due lo fossero, ma ti eri avvicinato di più :D). Prova a compilare con:

Codice: Seleziona tutto

-Wall -pedantic
generalmente questi errori grossolani li noti al volo così.

Spina