PDA

Visualizza la versione completa : problemino programmazione c I/O basso livello


luk76
09-09-2015, 12:28
Ciao ragazzi ho un problema con questo 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è?

Samuele_70
09-09-2015, 23:32
Non tenevi in considerazione l'assenza del terminatore di stringa.
la getchar() in questo caso non serve a nulla :)


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

luk76
10-09-2015, 09:36
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..

Samuele_70
10-09-2015, 13:15
prova con


while( strncmp( s, "fine", 4) != 0 );

Scara95
10-09-2015, 15:56
prova con


while( strncmp( s, "fine", 4) != 0 );

Non va bene comunque, potrebbe essere divisa in due letture o non essere fra i primi caratteri letti.

Samuele_70
10-09-2015, 21:19
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.

luk76
11-09-2015, 12:19
prova con


while( strncmp( s, "fine", 4) != 0 );

si funziona grazie :)

Scara95
11-09-2015, 12:41
si funziona grazie :)

No, non funziona, va a fortuna

Samuele_70
11-09-2015, 13:20
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.

Scara95
11-09-2015, 21:48
Non c'è scritto da nessuna parte nel testo.

Loading