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
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
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