У меня есть программа под названием abc
.
Когда я запускаю следующую команду:
$ ./abc < infile
, я получаю следующий результат:
ijklm
Однако, когда я run:
$ ./abc < infile > outfile
$ cat outfile
Я получил следующий результат:
ijkoo
Теперь я предполагаю, что это ошибка моей программы. Однако, независимо от того, что делает моя программа, я не знаю, как это возможно.
EDIT:
Теперь, когда я знаю, что это возможно, мне любопытно, что именно в моей программе вызывает это.
В моей программе есть блок внутри цикла, который содержит:
byte = ascii_to_byte(asciibyte);
putchar(byte);
байт имеет тип char
.
Теперь, если я изменю putchar (byte)
to printf ("% c", byte)
весь вывод останется прежним.
Однако, если я изменю его на printf ("% d", byte)
, тогда $ ./abc
105106107111111
Это десятичное представление этих символов ascii, как они были в Outfile
. Но это не десятичное представление символов в том виде, в каком они фактически появились, когда их только что отправили на стандартный вывод. Я не понимаю, почему может быть эта разница.
РЕДАКТИРОВАТЬ №2:
Если я изменю строку печати на printf ("% c \ n", byte)
, то ] $ ./abc
i
j
k
o
o
Это согласуется с тем, что идет в Outfile. Опять же, не уверен, в чем разница.
РЕДАКТИРОВАТЬ # 3
Я только что протестировал это на 32-битной машине, и программа работает: выходной файл
содержит ijklm
. Wierd.
РЕДАКТИРОВАТЬ # 4
Вот основная функция:
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;
}
А вот функция 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;
}
ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ
Я заметил, что мне нужно было инициализировать байт как 0x00. Проблема решена. Почему я такой отсталый? Я дам ответы тем, кто может конкретно объяснить, как это вызвало проблему.