Бъгава програма

6 отговора 299 прегледа
#1

Бъгава програма

Hi, искам да попитам защо в програмата ми се получава бъг? Когато заредя файл с АСКИ символите (писан като бинарен в Visual C++), програмата отпачатва бинарните кодове през 1, т.е. от 00000000 минава на 00000010 и прескача 00000001.
А ето и сорса й:

#include <stdio.h>
#include <stdlib.h>
struct sample {
unsigned a: 1;
unsigned b: 1;
unsigned c: 1;
unsigned d: 1;
unsigned e: 1;
unsigned f: 1;
unsigned g: 1;
unsigned h: 1;
};
union key_type {
unsigned char ch;
struct sample bits;
} key;
int main(int argc, char *argv[])
{
FILE *fp;
if(argc != 2){
printf("Usage: bits <source>\n");
exit(1);
}
if((fp = fopen(argv[1], "rb")) == NULL){
printf("Cannot reading a source file\n");
exit(1);
}
for(;;){
key.ch = fgetc(fp);
if(fgetc(fp) == EOF) break;
if(key.bits.h) printf("1");
else printf("0");
if(key.bits.g) printf("1");
else printf("0");
if(key.bits.f) printf("1");
else printf("0");
if(key.bits.e) printf("1");
else printf("0");
if(key.bits.d) printf("1");
else printf("0");
if(key.bits.c) printf("1");
else printf("0");
if(key.bits.b) printf("1");
else printf("0");
if(key.bits.a) printf("1");
else printf("0");
switch(key.ch){
case 0: printf(" 00"); break;
case 1: printf(" 01"); break;
case 2: printf(" 02"); break;
case 3: printf(" 03"); break;
case 4: printf(" 04"); break;
case 5: printf(" 05"); break;
case 6: printf(" 06"); break;
case 7: printf(" 07"); break;
case 8: printf(" 08"); break;
case 9: printf(" 09"); break;
case 10:printf(" 0A"); break;
case 11:printf(" 0B"); break;
case 12:printf(" 0C"); break;
case 13:printf(" 0D"); break;
case 14:printf(" 0E"); break;
case 15:printf(" 0F"); break;
default: printf(" %X", key.ch);
}
printf(" ");
}
return 0;
}


Отговор
в отговор на mialy #2

Re: Бъгава програма

key.ch = fgetc(fp);
if(fgetc(fp) == EOF) break;

ей затва на...

Отговор
в отговор на mialy #3

Re: Бъгава програма

Колкото и да ти е странно fgetch връща int. Същото се отнася за всички функции, дето работят с char. Особено преебано е при аргументите на ф-иите. Не ми се разглежда в детайли, но ти сам ще си намериш проблема.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на Colombino #4

I don't find ...

Честно казано, не мога да си намеря грешката.

Отговор
в отговор на mialy #5

Re: I don't find ...

абе човек, специално ти обърнаха внимание, че четеш два пъти един след друг от файла - втория път при проверката за край на файл. Вместо това използвай резултата от първото четене и само него проверявай.

стой та гледай
Отговор
в отговор на mialy #6

Viele danke!

Открих грешката си най-после ;-) Просто от обединението key_type вместо char ch, промених на int ch и промених fgetc на if((key.ch = fgetc(fp)) == EOF) break;
Само искам да кажа, че ако нямаше такива клубове, незнам какво щях да правя. Благодаря ви!

Отговор
в отговор на mialy #7

Viele danke!

Открих грешката си най-после ;-) Просто от обединението key_type вместо char ch, промених на int ch и промених fgetc на if((key.ch = fgetc(fp)) == EOF) break;
Само искам да кажа, че ако нямаше такива клубове, незнам какво щях да правя. Благодаря ви!

Отговор