Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103

    [C]funzione di lettura di una linea

    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

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C]funzione di lettura di una linea

    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

    Uranya
    codice:
    FILE *stream;
    char buffer[100];
    
    .... apertura ecc...
    
    fgets (buffer, sizeof (buffer), stream);
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    ma allora non esiste una funzione tipo readline()?
    devo per forza usare la fgets()??

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da uranya
    ma allora non esiste una funzione tipo readline()?
    Nella libreria standard del C, no.
    C'è da dire che una readline() esiste ma è una funzione specifica di Linux per leggere una linea dal terminale.

    Originariamente inviato da uranya
    devo per forza usare la fgets()??
    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).

    Forse fai prima a dirci cosa vuoi fare realmente. Quale è il problema?? Non ti va bene fgets?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Readln() è una funzione Pascal . Da questo link puoi scaricarti una funzione equivalente a quella del Pascal . Saluti

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    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);
    }



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

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    si infatti è quello che vorrei cercare di fare!!

    questo è quello che ho pensato di modificare, ma non funziona perchè nn riconosce la readline()
    #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);
    }


    eppure nella libreria basic.h è stata implementata dal prof. UFFA!!

  9. #9
    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;
    				}
    			}
    		}
    	}
    Questo è il codice che ho usato io per il progetto di sistemi operativi all'università
    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

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    103
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.