Προς το περιεχόμενο

text input C


fonsde

Προτεινόμενες αναρτήσεις

Δημοσ.

έχω ένα 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';
}

Δημοσ.

θα μπορούσες να κάνεις κάτι τέτοιο

αλλά θα ήταν καλύτερο να το κάνεις δυναμικά

 

δουλεύει για μέχρι 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;
                       }
   }
   
}  


Δημοσ.
>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");
}

Δημοσ.

Ευγένιος, έπεσες πάνω στο πρόβλημα που απέφυγε ο 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;
}

Δημοσ.

Δεν αναφερει ποσα 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");

}

 

Δημοσ.
Δεν αναφερει ποσα bit ειναι αυτο που θελει να διαβασει, αρα υποτιθετε οτι ειναι σε 32bit sys αρα θα μιλαει για ενα DWORD.

Χωράει ο αριθμός 0x0123456789ABCDEF σε DWORD?

Δημοσ.

Αμα θελει να διαβασει αυτο "0123456789ABCDEF" παω πασο....

ΥΓ: μου φαινεται περισσοτερο με το "ποιες τιμες μπορει να παρει το HEX" παρα για αρθμο (μιλαω για το "0123456789ABCDEF")

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...