Бъгава програма
6 отговора
299 прегледа
Бъгава програма
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;
}
А ето и сорса й:
#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;
}
Re: Бъгава програма
Колкото и да ти е странно fgetch връща int. Същото се отнася за всички функции, дето работят с char. Особено преебано е при аргументите на ф-иите. Не ми се разглежда в детайли, но ти сам ще си намериш проблема.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Re: I don't find ...
абе човек, специално ти обърнаха внимание, че четеш два пъти един след друг от файла - втория път при проверката за край на файл. Вместо това използвай резултата от първото четене и само него проверявай.
стой та гледай
стой та гледай
Viele danke!
Открих грешката си най-после ;-) Просто от обединението key_type вместо char ch, промених на int ch и промених fgetc на if((key.ch = fgetc(fp)) == EOF) break;
Само искам да кажа, че ако нямаше такива клубове, незнам какво щях да правя. Благодаря ви!

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

Само искам да кажа, че ако нямаше такива клубове, незнам какво щях да правя. Благодаря ви!