我有一個程序叫abc
。stdout重定向改變輸出
當我運行下面的命令:
$ ./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一致。再次,不知道有什麼區別。
編輯#3
我只是測試這32位機器上,且運行:outputfile
包含ijklm
。奇怪的。
編輯#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。問題解決了。我爲什麼這麼遲鈍?我會給出答案,以便誰可以具體解釋這是如何引發問題的。
是輸出總是一樣嗎?如果你運行./abc幾次,你會得到相同的結果嗎? – 2011-05-24 14:13:08
是的,輸出在多次試驗中是一致的。 – oadams 2011-05-24 14:19:41
'./abc
pmg
2011-05-24 14:26:32