2015-02-25 2 views
2

Я пытаюсь прочитать из текстового файла в C, который содержит список из 8-битных двоичных чисел, которые будут использоваться в другой функции.Чтение 8-битных двоичных чисел из текста Файл в C

The text file is formatted like: 
01101101 
10110110 
10101101 
01001111 
11010010 
00010111 
00101011 

Ect. , ,

Heres любопытное то, что я пытался сделать

Псевдокод

void bincalc(char 8_bit_num){ 
//does stuff 
} 

int main() 
{ 
    FILE* f = fopen("test.txt", "r"); 
    int n = 0, i = 0; 
while(fscanf(f, "%d ", &n) > 0) // parse %d followed by a new line or space 
{ 
    bincalc(n); 

} 

fclose(f); 

}

Я думаю, что я нахожусь на правильном пути, однако любая помощь приветствуется.

+1

Просто прочитайте все строки ('fgets' или' fscanf (f, "% s ...)'), а затем проанализируйте их одним. –

+0

Ваше предложение не будет работать. Десятичное число, прочитанное так * far * больше, чем может быть сохранено в 'char', вы можете хранить не более трех« buts »таким образом. Разбор * decimal * как двоичный файл возможен, но может быть проще просто проанализировать фактических символов, как строка. – usr2564301

+1

код считывает int (4 байта), и функция bincalc ожидает, что char (1 байт) предложит преобразовать вход в символ с помощью 8 символов и сжать их в один символ из 8 бит, а затем вызвать функцию bincalc с помощью результат этого сжатия – user3629249

ответ

0

Это не стандартный трек, чтобы сделать это, но все в порядке. Вы просматриваете файл, читающий int s, чтобы он читал строку и интерпретировал ее как десятичное число, которое вы должны в свою очередь преобразовать в , соответствующий двоичный код, то есть преобразование 1010 десятичного в 2^3 + 2^1 = 9 десятичных знаков. Это, конечно, возможно, вам нужно только transform степенями десяти до степеней 2 (1.10^3 + 0.10^2 + 1.10^1 + 0.10^0 до 1.2^3 + 0.2^2 + 1.2^1 + 0.2^0). Будьте осторожны, чтобы эта работа с 8-битными номерами, но не со слишком большими (16 бит не будет).

Более распространенным способом является чтение строк и декодирование строк непосредственно, или чтение символа с помощью char и внесение инкрементного преобразования.

0

Если вы хотите, чтобы иметь номер в конце концов, я хотел бы предложить что-то вроде следующего:

int i; 
char buf[10], val; 
FILE* f = fopen("test.txt", "r"); 

while(! feof(f)) { 
    val = 0; 
    fscanf(f, "%s", buf); 
    for(i=0; i<8; i++) 
    val = (val << 1) | (buf[i]-48); 
    /* val is a 8 bit number now representing the binary digits */ 
    bincalc(val); 
} 

fclose(f); 

Это лишь короткий фрагмент кода, чтобы проиллюстрировать эту идею и не улавливает все случаи углу относительно файла или обработки буфера. Я надеюсь, что это все равно поможет.

+2

Функция feof() недействительна до тех пор, пока вы не прочтёте ее после конца файла. В общем, никогда не используйте feof для контроля цикла, остальная часть этого ответа выглядит хорошо – user3629249

0

Я думаю, что это возможное решение, я сделал его простым, чтобы вы могли понять и адаптироваться к вашим потребностям. Вам нужно только повторить это для каждой строки.

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *file =fopen("data","r"); 
    char *result=calloc(1,sizeof(char)); 
    char line[8]; 
    int i=0; 

    for(;i<8;i++) 
    { 
     char get = (char)getc(file); 
     if(get == '0') 
     *result <<= 1; 
     else if(get == '1') 
     *result = ((*result<<1)|0x1) ; 
    } 

    printf("->%c\n",*result); 
    return 0; 
} 
0

Я не знаю способ указать двоичный формат для fscanf(), но вы можете преобразовать двоичную строку, как это.

#include <stdio.h> 
#include <stdlib.h> 

void fatal(char *msg) { 
    printf("%s\n", msg); 
    exit (1); 
} 

unsigned binstr2int(char *str) { 
    int i = 0; 
    while (*str != '\0' && *str != '\n') { // string term or newline? 
     if (*str != '0' && *str != '1')  // binary digit? 
      fatal ("Not a binary digit\n"); 
     i = i * 2 + (*str++ & 1); 
    } 
    return i; 
} 

int main(void) { 
    unsigned x; 
    char inp[100]; 
    FILE *fp; 
    if ((fp = fopen("test.txt", "r")) == NULL) 
     fatal("Unable to open file"); 
    while (fgets(inp, 99, fp) != NULL) { 
     x = binstr2int(inp); 
     printf ("%X\n", x); 
    } 
    fclose (fp); 
    return 0; 
} 

входного файла

01101101 
10110110 
10101101 
01001111 
11010010 
00010111 
00101011 

выход программы

6D 
B6 
AD 
4F 
D2 
17 
2B 
0

Прочитайте файл построчно, а затем использовать strtol() с базой 2.

Или, если файл гарантированно недолговечен, вы также можете прочитать полное содержимое в (динамически выделенной) памяти и использовать параметр endptr.

Смежные вопросы