मेरे पास 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
में थे। लेकिन यह वर्णों का दशमलव प्रतिनिधित्व नहीं है क्योंकि वे वास्तव में तब दिखाई दिए जब वे अभी stdout पर भेजे गए थे। मुझे समझ में नहीं आता कि यह अंतर क्यों हो सकता है।
संपादित करें # 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 चलाते हैं, तो क्या आपको वही परिणाम मिलता है? –
हां, आउटपुट कई परीक्षणों पर संगत है। – oadams
'./abc
pmg