[Risolto] lettura da file system call

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

[Risolto] lettura da file system call

Messaggio 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
Ultima modifica di gian2991 il lunedì 8 giugno 2015, 17:48, modificato 1 volta in totale.
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: lettura da file system call

Messaggio 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.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: lettura da file system call

Messaggio 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
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: lettura da file system call

Messaggio da gian2991 »

si si scusate era il C
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: lettura da file system call

Messaggio 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?
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: lettura da file system call

Messaggio da SuperStep »

my_string dovrebbe essere un doppio puntatore a char.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: lettura da file system call

Messaggio da gian2991 »

an ok, però mi dà errore sul terzo parametro(fd_in) che passo
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: lettura da file system call

Messaggio 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;
}
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
gian2991
Prode Principiante
Messaggi: 55
Iscrizione: sabato 4 aprile 2015, 0:24
Sesso: Maschile

Re: lettura da file system call

Messaggio 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
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: lettura da file system call

Messaggio 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
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti