stdout redirect изменяя вывод

У меня есть программа под названием 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. Проблема решена. Почему я такой отсталый? Я дам ответы тем, кто может конкретно объяснить, как это вызвало проблему.

6
задан oadams 25 May 2011 в 01:21
поделиться