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