Pagina 1 di 1

[Risolto] lettura da file system call

Inviato: sabato 6 giugno 2015, 18:32
da gian2991
ciao a tutti, ho un problema, in pratica io devo leggere da un file una riga per volta, ogni riga è formata al massimo da un carattere e da 2 interi, vorrei sapere come fare per leggere una riga alla volta e poi estrarre singolarmente i caratteri e i numeri
grazie

Re: lettura da file system call

Inviato: sabato 6 giugno 2015, 22:16
da SuperStep
che linguaggio?

supponendo sia il linguaggio C. esiste la funzione getline

Codice: Seleziona tutto

 ssize_t getline(char **lineptr, size_t *n, FILE *stream);
che ti restituisce un **char contenente la riga letta. Non devi fare altro che prendere l'elemento [0], [1], [2] di lineptr.

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 11:30
da cortinico
gian2991 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4766189#p4766189][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:ciao a tutti, ho un problema, in pratica io devo leggere da un file una riga per volta, ogni riga è formata al massimo da un carattere e da 2 interi, vorrei sapere come fare per leggere una riga alla volta e poi estrarre singolarmente i caratteri e i numeri
grazie
Linguaggio?
Se C la risposta l'hai già ricevuta, altrimenti facci sapere

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 13:38
da gian2991
si si scusate era il C

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 13:46
da gian2991

Codice: Seleziona tutto

char *my_string;
	int y;
	int bytes=100;
	
	/////////////////////////////////////////// LETTURA DA FILE ////////////////////////////////////////////////////

	if((fd_in=open("file1.txt",O_RDONLY,0644))==-1){
		write(2,"OPEN: -1",sizeof(char)*8);
		//syserr("mycat", "Cannot open file.");
	}
	if((y=getline(&my_string,&bytes,fd_in))==-1){
		printf("errore");
		exit(1);
	}
	puts(my_string);
quindi una cosa così sarebbe corretta?

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 13:57
da SuperStep
my_string dovrebbe essere un doppio puntatore a char.

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 14:01
da gian2991
an ok, però mi dà errore sul terzo parametro(fd_in) che passo

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 14:08
da cortinico
Infatti il codice che hai scritto non va.
Il problema è che stai mescolando chiamate di libreria (tipo la getline) e system call (tipo la open).
Scegli se usare syscall o chiamate di libreria ed utilizza solo quelle.

In particolare il problema deriva dal fatto che la libreria utilizza il tipo FILE * per gestire i descrittori dei files, mentre le syscall usano i valori interi per riferire i descrittori.
Ti posto il codice corretto che utilizza solo chiamate di libreria

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
   char *my_string = NULL;
   int y;
   int bytes=100;
   FILE * fd_in;
   
   if((fd_in=fopen("test.txt","r")) == NULL){
      fprintf(stderr,"FOPEN: Null Value\n");
      /* syserr("mycat", "Cannot open file."); */
   }
   my_string = (char *)malloc((bytes+1));
   if((y=getline(&my_string, (size_t *)&bytes,fd_in))==-1){
      fprintf(stderr,"GETLINE: Failure to read line\n");
      exit(1);
   }
   puts(my_string);
   /* code */
   return 0;
}

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 14:11
da gian2991
il problema è che io posso usare esclusivamente system calls, il file lo riesco a leggere completamente, solo che per decidere le operazioni da fare dovrei riuscire a estrarrei singoli caratteri

Re: lettura da file system call

Inviato: lunedì 8 giugno 2015, 14:17
da cortinico
gian2991 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4766608#p4766608][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:il problema è che io posso usare esclusivamente system calls, il file lo riesco a leggere completamente, solo che per decidere le operazioni da fare dovrei riuscire a estrarrei singoli caratteri
Allora non puoi usare la getline in quanto non è una system call. Devi usare una read. Se sai già come è fatto il tuo file puoi organizzarti e fare delle read di lunghezza precisa, altrimenti devi utilizzare funzioni da strings.h tipo strchr per beccare il carattere di newline