fonsde Δημοσ. 21 Νοεμβρίου 2009 Δημοσ. 21 Νοεμβρίου 2009 έχω ένα text της μορφής > 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF 0123456789ABCDEF όπου είναι αριθμοί μορφής hex . Θέλω να διαβάζω από το text τους αριθμούς να τους μετατρέπω σε binary και να τους κρατώ κάπου (πίνακα ?) >char key[60]; fp= fopen("conf.txt","r"); while(!feof(fp)) { readline(fp,line); sscanf (line,"%s",key); } void readline(FILE *fp, char line[]) { char c; int pos = 0; while(1) { fscanf(fp, "%c", &c); if(c == '\n' || pos>=199 || feof(fp)) break; line[pos++] = c; } line[pos] = '\0'; }
virxen75 Δημοσ. 21 Νοεμβρίου 2009 Δημοσ. 21 Νοεμβρίου 2009 θα μπορούσες να κάνεις κάτι τέτοιο αλλά θα ήταν καλύτερο να το κάνεις δυναμικά δουλεύει για μέχρι 200 εγγραφές θεωρώ ότι τα περιεχόμενα του αρχείου είναι με κεφαλαία γράμματα > #include <stdio.h> #include <stdlib.h> #include <string.h> void readline(FILE *, char []); //θα μπορούσες να το γεμίσεις(hexvalues) με μια συνάρτηση char hexvalues[16][5]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"}; char hexletters[]="0123456789ABCDEF"; int main(void){ char finish[1]; char binaryvalues[200][200];//μπορείς να τον ορίσες δυναμικά int k=-1; char key[60]; FILE *fp= fopen("conf.txt","r"); while(!feof(fp)) { k++; char line[200]=""; readline(fp,line); sscanf (line,"%s",key); strcat(binaryvalues[k],key); } for (int i=0;i<=k;i++)//κ -->μέχρι ποια θέση του πίνακα(από τις 200) έχω βάλει στοιχεία printf("\nconverted value=%s",binaryvalues[i]); gets(finish);//αν δουλεύεις dev c++ απλά για να δεις το αποτέλεσμα } void readline(FILE *fp, char line[]){ char c; int pos = 0; while(1) { fscanf(fp, "%c", &c); if(c == '\n' || pos>=199 || feof(fp)) break; pos++; for (int j=0;j<16;j++) if (hexletters[j]==c) {//αν ο χαρακτήρας που διάβασες από το αρχείο //αντιστοιχεί σε δεκαεξαδικό ψηφίο strcat(line,hexvalues[j]);//τότε πρόσθεσε στο string μας το //δυαδικό αντίστοιχο του break; } } }
Evgenios1 Δημοσ. 21 Νοεμβρίου 2009 Δημοσ. 21 Νοεμβρίου 2009 >void main(void) { FILE *f = fopen("E:\\test.txt","r"); /* * ----test.txt---- * 000000ff 0000000f * 0000ffff 0000000e */ int obj; while(fscanf(f,"%x",&obj)==1) printf("%d\n",obj); /* * ---output--- 255 15 65535 14 Press any key to continue . . . */ fclose(f); system("Pause"); }
C6WGMN Δημοσ. 21 Νοεμβρίου 2009 Δημοσ. 21 Νοεμβρίου 2009 Ευγένιος, έπεσες πάνω στο πρόβλημα που απέφυγε ο virxen75. Οι δοσμένοι αριθμοί είναι 64bit (συγκεκριμένα είναι 60bit, λόγο καταληκτικών μηδενικών), και έτσι δεν χωράνε σε ένα int. ούτε καν έλυσες το πρόβλημα, αφού ζητάει ένα διάδικο αριθμό για έξοδο και το δικό σου πρόγραμμα δίνει δεκαδικούς αριθμούς. Μια λύση που προτείνω είναι να χρησιμοποιήσεις το long long int, το οποιο έχει τουλάχιστον 64bits, και επίσης να αλλάξεις το conversion specifier σε %llu. Για να τυπώσεις σωστά τον αριθμό ως δυαδικό θα χρησιμοποιούσες αυτή τη συνάρτηση: > void llu2b(unsigned long long k, char m[static 65]) { unsigned long long r; for(r = ~(~0ULL>>1); r; r >>= 1) *m++ = '1' - !(k&r); *m = 0; } ως ολοκληρωμένο πρόγραμμα: > #include <stdio.h> void llu2b(unsigned long long k, char m[static 65]) { unsigned long long i = ~(~0ULL>>1); for(i = ~(~0ULL>>1); i; i>>=1) *m++ = '1' - !(k&i); *m = 0; } int main(void) { unsigned long long k = 0; char m[65] = {0}; scanf("%llx", &k); llu2b(k, m); puts(m); return 0; }
Evgenios1 Δημοσ. 21 Νοεμβρίου 2009 Δημοσ. 21 Νοεμβρίου 2009 Δεν αναφερει ποσα bit ειναι αυτο που θελει να διαβασει, αρα υποτιθετε οτι ειναι σε 32bit sys αρα θα μιλαει για ενα DWORD. Τωρα για το δευτερο (να τα προβαλει σε binary)... μια αναζητηση στο google και θα ειναι οκ. Μια απλη λυση >typedef char PRINT_TYPE; void print_binary(PRINT_TYPE a) { PRINT_TYPE i = sizeof(PRINT_TYPE) * 8; for( ; i > -1 ; i--) if((a & (PRINT_TYPE)pow(2.0,i))==0) printf("0"); else printf("1"); }
C6WGMN Δημοσ. 22 Νοεμβρίου 2009 Δημοσ. 22 Νοεμβρίου 2009 Δεν αναφερει ποσα bit ειναι αυτο που θελει να διαβασει, αρα υποτιθετε οτι ειναι σε 32bit sys αρα θα μιλαει για ενα DWORD. Χωράει ο αριθμός 0x0123456789ABCDEF σε DWORD?
Evgenios1 Δημοσ. 22 Νοεμβρίου 2009 Δημοσ. 22 Νοεμβρίου 2009 Αμα θελει να διαβασει αυτο "0123456789ABCDEF" παω πασο.... ΥΓ: μου φαινεται περισσοτερο με το "ποιες τιμες μπορει να παρει το HEX" παρα για αρθμο (μιλαω για το "0123456789ABCDEF")
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.