Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    3

    problemino programmazione c I/O basso livello

    Ciao ragazzi ho un problema con questo codice:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h> //definisce macro STDIN_FILENO, STDERR_FILENO, STDOU_FILENO
    
    #define MAX_SIZE 50
    
    /*Scrivere un programma in linguaggio C che, utilizzando le funzioni di I/O a basso livello, in un ciclo infinito:
    -Legge dallo standard input una stringa S
    -Visualizza su standard error la stringa S
    -Il programma termina quando l’utente digita la stringa “fine”
    Cosa è necessario modificare nel codice affinché il programma legga l’input da un file invece che da standard input?*/
    
    int main()
    {
        char *s = malloc(sizeof(char)*MAX_SIZE);
        do{
        int r = read(STDIN_FILENO, s, MAX_SIZE);
        if(r==-1) printf("errore");
        else{
            write(STDERR_FILENO, s, MAX_SIZE);
        }
        while(getchar()!='\n');
        }while(strcmp(s,"fine\n")!=0);
        free(s);
        return 0;
    }
    il problema è che mi produce output sbagliato, infatti stdin non risulta ''pulito'' ad ogni iterazione del do while. So che in windows si usa fflush(stdin) ma girando in rete ho visto che questa funzione non è portabile in linux. visto che io uso linux, sempre girando in rete ho visto che molti dicono che la soluzione sia ''while(getchar()!='\n''' al posto di fflush, ma il problema non si è risolto.Inoltre ho letto diverse discussioni su questo forum riguardanti il mio stesso problema e davano tutti la soluzione "while(getchar()!='\n", ma non capisco come mai a me non funziona.. Sapete spiegarmi perchè?

  2. #2
    Non tenevi in considerazione l'assenza del terminatore di stringa.
    la getchar() in questo caso non serve a nulla
    codice:
    int main()
    {
        char *s = malloc(sizeof(char)*MAX_SIZE);
        int r=0;
        do
        {
            r = read( STDIN_FILENO, s, MAX_SIZE);
            if(r==-1) 
                printf("errore");
            else
                write( STDERR_FILENO, s, r);
        }
        while( strncmp( s, "fine\n", r) != 0 );
        free(s);
        return 0;
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    3
    ciao adesso con la riga r = read(STDIN_FILENO, s, r) il programma non fa più capricci in output, però resta il problema che quando vado a digitare la parola fine il programma a volte termina subito, a volte dopo l'inserimento di un altra stringa, a volte non termina proprio..

  4. #4
    prova con
    codice:
    while( strncmp( s, "fine", 4) != 0 );
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da Samuele_70 Visualizza il messaggio
    prova con
    codice:
    while( strncmp( s, "fine", 4) != 0 );
    Non va bene comunque, potrebbe essere divisa in due letture o non essere fra i primi caratteri letti.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Non va bene comunque, potrebbe essere divisa in due letture o non essere fra i primi caratteri letti.
    no, non va bene, come dici tu non ha alcun senso.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2015
    Messaggi
    3
    Quote Originariamente inviata da Samuele_70 Visualizza il messaggio
    prova con
    codice:
    while( strncmp( s, "fine", 4) != 0 );
    si funziona grazie

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Quote Originariamente inviata da luk76 Visualizza il messaggio
    si funziona grazie
    No, non funziona, va a fortuna
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    No, non funziona, va a fortuna
    La parola "fine" essendo un comando sarà l'unica parola presente nella riga di input, quindi funziona in ogni caso.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non c'è scritto da nessuna parte nel testo.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.