potreste ricordarmi qual'è la funzione del linguaggio C che legge una intera linea per volta?
readline() oppure readln() o qualcosa del genere.
Possibilmente inserite pure un esempio pratico così ricordo meglio anche la sintassi.
Grazie
Uranya
potreste ricordarmi qual'è la funzione del linguaggio C che legge una intera linea per volta?
readline() oppure readln() o qualcosa del genere.
Possibilmente inserite pure un esempio pratico così ricordo meglio anche la sintassi.
Grazie
Uranya
Originariamente inviato da uranya
potreste ricordarmi qual'è la funzione del linguaggio C che legge una intera linea per volta?
readline() oppure readln() o qualcosa del genere.
Possibilmente inserite pure un esempio pratico così ricordo meglio anche la sintassi.
Grazie
Uranyacodice:FILE *stream; char buffer[100]; .... apertura ecc... fgets (buffer, sizeof (buffer), stream);
ma allora non esiste una funzione tipo readline()?
devo per forza usare la fgets()??
Nella libreria standard del C, no.Originariamente inviato da uranya
ma allora non esiste una funzione tipo readline()?
C'è da dire che una readline() esiste ma è una funzione specifica di Linux per leggere una linea dal terminale.
fgets legge una linea da un certo stream. Esiste la gets che legge direttamente da STDIN ma è notoriamente "insicura" (non conosce la dimensione del buffer).Originariamente inviato da uranya
devo per forza usare la fgets()??
Forse fai prima a dirci cosa vuoi fare realmente. Quale è il problema?? Non ti va bene fgets?
Readln() è una funzione Pascal . Da questo link puoi scaricarti una funzione equivalente a quella del Pascal . Saluti
in effetti devo utilizzarla per controllare la fine di una stringa inviata dal Server ad un Client.
Siccome se faccio un ciclo while, la risposta del Client viene trasmessa, ma poi il Client rimane bloccato perchè la ulteriore read non ha più niente nel buffer, ho pensato di inserire una readln così non dovrebbe bloccarsi, il codice che devo sostituire è:
#include "basic.h"
main(int argc, char *argv[])
{
int sockfd,n;
struct sockaddr_in servaddr;
char buff[MAXLINE];
if(argc!=2)
err_quit("Usage: %s <IP address>\n",argv[0]);
if ( (sockfd = socket(AF_INET, SOCK_STREAM,0)) < 0 )
err_sys("socket error");
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
servaddr.sin_port = htons(SERV_PORT);
if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) <0)
err_sys("connect error");
while ( (n = read(sockfd, buff, MAXLINE)) > 0 ) {
buff[n] = 0;
if (fputs(buff, stdout) == EOF)
err_sys("errore in fputs");
}
if (n < 0)
printf("errore in read");
exit(0);
}
Potresti fare in modo che il server invii un carattere terminatore per indicare la fine dell'invio, cosi che tu puoi controllare se l'ultimo carattere presente nel buffer è questo carattere allora l'invio è terminato e esci dal while, altrimenti continui.
Come carattere terminatore puoi usare il \0 ad esempio
si infatti è quello che vorrei cercare di fare!!
questo è quello che ho pensato di modificare, ma non funziona perchè nn riconosce la readline()
eppure nella libreria basic.h è stata implementata dal prof. UFFA!!#include "basic.h"
main(int argc, char *argv[])
{
int sockfd,n,m,k;
struct sockaddr_in servaddr;
char buff[MAXLINE];
char buff4[MAXLINE];
char buff2[MAXLINE]="grazie\n";
if(argc!=2)
err_quit("Usage: %s <IP address>\n",argv[0]);
if ( (sockfd = socket(AF_INET, SOCK_STREAM,0)) < 0 )
err_sys("socket error");
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr(argv[1]);
servaddr.sin_port = htons(SERV_PORT);
if(connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) <0)
err_sys("connect error");
if (n = readline(sockfd, buff, MAXLINE) > 0)
{
buff[n] = 0;
if (fputs(buff, stdout) == EOF)
err_sys("errore in fputs");
if((write(sockfd,buff2,strlen(buff2)))!=strlen(buf f2));//scrive grazie
err_sys("write error");
}
if (n < 0)
printf("errore in read");
exit(0);
close(sockfd);
}
Questo è il codice che ho usato io per il progetto di sistemi operativi all'universitàcodice:while (flag) { if ((bytes=read(sock,buf,512))<0) { perror("Impossibile leggere dal socket\n"); exit(1); } switch (bytes) { case 0 : { //Lettura terminata flag=0; break; } default : { //Controllo della presenza del carattere terminatore tra i dati inviati e stampa dei dati a video if (buf[bytes-2]!='\0') { //Il carattere non è presente quindi si continua buf[bytes-1]='\0'; write(STDOUT_FILENO,buf,bytes-1); } else { //Il carattere è presente, si stampa il contenuto del buffer e si modifica la flag write(STDOUT_FILENO,buf,bytes-2); flag=0; } } } }
Testato su Suse Linux 10.0
Come puoi vedere ogni volta che ricevo dati nel buffer tramite la read controllo se nell'ultimo carattere valido è presente il carattere \0. se c'è modifico la flag e interrompo il ciclo, altrimenti mi limito a inserire io il carattere terminatore e stampare il buffer a schermo.
E cosi eviti di usare questa fantomatica readline del tuo prof
grazie doraemon, darò un occhiata alla tua soluzione.
Anche il prof. mi ha risposto a dire il vero, e lui mi ha detto di includere la libreria "my_io.c".
ora farò qlc prova.
Bye
alla prox