Tengo un programa llamado abc
.stdout redirect cambio de salida
Cuando ejecuto el siguiente comando:
$ ./abc < infile
me sale el siguiente resultado:
ijklm
Sin embargo, cuando corro:
$ ./abc <infile> outfile
$ cat outfile
me da este resultado:
ijkoo
Ahora, asumo que esto es un error en mi programa. Sin embargo, independientemente de lo que esté haciendo mi programa, no sé cómo es posible.
EDIT:
Ahora que sé que es posible, estoy curioso en cuanto a lo que está en mi programa que está causando esto.
hay un bloque dentro de un bucle en mi programa que contiene:
byte = ascii_to_byte(asciibyte);
putchar(byte);
byte es de tipo char
.
Ahora si cambio putchar(byte)
a printf("%c", byte)
toda la salida se mantiene igual.
Sin embargo, si la cambio a printf("%d", byte)
, entonces $ ./abc < infile
salidas:
105106107111111
que es la representación decimal de los caracteres ASCII como lo fueron en outfile
. Pero no es la representación decimal de los personajes tal como aparecieron cuando se enviaron a stdout. No entiendo por qué podría haber esta diferencia.
editar # 2:
Si cambio de la línea de impresión a printf("%c\n", byte)
, entonces $ ./abc < infile
salidas:
i
j
k
o
o
Esto es consistente con lo que entra en archivo_salida. De nuevo, no estoy seguro de cuál es la diferencia.
editar # 3
Acabo de probar esto en una máquina de 32 bits, y el funcionamiento del programa: outputfile
contiene ijklm
. Wierd.
editar # 4
Esta es la función principal:
int main()
{
char asciibyte[8];
char byte;
int c; //Using int to avoid the EOF pitfall.
long charcount = 0;
while((c = getchar()) != EOF){
if(c != '0' && c != '1'){
continue;
}
asciibyte[charcount % 8] = c;
if(charcount % 8 == 7){
/*Testing revealed that at this point asciibyte does contain
what it should contain, eight ASCII ones and zeros representing
a byte read in from stdin*/
byte = ascii_to_byte(asciibyte);
/*Print statements such as:
printf("%d", byte);
printf("%c\n", byte);
reveal that the ascii_to_byte function works incorrectly on my
64 bit machine. However these statements:
putchar(byte);
printf("%c", byte);
make it appear as though the function operates as it should.
EXCEPT if i redirect that output to a file.*/
putchar(byte);
}
charcount++;
}
return 0;
}
Y aquí es la función ascii_to_byte:
char ascii_to_byte(char *asciibyte){
char byte;
int i;
for(i = 0; i < 8; ++i){
if(asciibyte[7-i] == '1'){
byte = byte | (1 << i);
}
}
return byte;
}
edición final
Noté que debería haber inicializado el byte a 0x00. Problema resuelto. ¿Por qué estoy tan retrasado? Daré respuestas a quienes puedan explicar específicamente cómo esto causó el problema.
¿La salida es siempre la misma? si ejecuta ./abc un par de veces, ¿obtiene el mismo resultado? –
Sí, el resultado es constante en varias pruebas. – oadams
cuál es la salida de './abc
pmg