Банальный перевод из двоичной в десятичную и запись в файл - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужна помощь чайнику. Не совсем понимаю, как прописать алгоритм перевода двоичного числа состоящего из 16 символов в каждой строке и последующая его запись в другой файл, в данном случае файл Z2.txt. Также первый символ в файле знаковый, 1 - это "+", а 0 - это "-0" (но это в коде прописано), важно то, что я никак не могу написать правильно алгоритм.
void conv(int q)
{
    int i, j, c;
    char z[17];
    FILE *f, *fx; 
    f = fopen("readme.txt", "r");
    fx = fopen("Z2.txt", "a");
    for (i = 0; i < q; i++)
    {
        fgets(z, 17, f);
        if (z[0] == '1')
        {
            z[0] = '+';
        }
        else
        {
            z[0] = '-';
        }
    }
    for (i = 0; i < q; i++)
        {
            for (j = 16; j > 0; j--)
            {
                if (z[j] == '1')
                    c += pow(2, 16 - (i + 1));
            }
        }
    printf("%d", c);
    fclose(f);  fclose(fx);
}
у меня при переводе в десятичную просто в любом случае отрицательное число и оно большое, смотрел по калькулятору, даже и близко не совпадает.
void conv(int q)
{
    int i, j, c = 0;
    char z[17];
    FILE *f, *fx; 
    f = fopen("readme.txt", "r");
    fx = fopen("Z2.txt", "a");
    for (i = 0; i < q; i++)
    {
        fgets(z, 17, f);
        if (z[0] == '1')
        {
            z[0] = '+';
        }
        else
        {
            z[0] = '-';
        }
    }
    for (i = 0; i < q; i++)
        {
            for (j = 16; j > 0; j--)
            {
                if (z[j] == '1')
                {
                    c += pow(2,j);
                }
            }
            printf("%d", c);
        }
    fclose(f);  fclose(fx);
}

Решение задачи: «Банальный перевод из двоичной в десятичную и запись в файл»

textual
Листинг программы
#include <stdio.h>
 
void convert_io(FILE* _out, FILE* _in){
    unsigned short x;
    char* p, s[20];
 
    while(((p = fgets(s, 19, _in)) != NULL) && !ferror(_in)){
        for(x = 0; *p == '0' || *p == '1'; ++p)
            x = (x << 1) | (unsigned short)(*p - '0');
        
        if(fprintf(_out, "%u\n", x) <= 0)
            break;
    }
    fflush(_out);
}
 
int main(void){
    FILE* fout, *fin;
    //вывод из файла в консоль
    if((fin = fopen("file.txt", "r")) != NULL){
        convert_io(stdout, fin);
        fclose(fin);
    }
 
/*     вывод из файла в другой файл
    fin  = fopen("input.txt", "r");
    fout = fopen("output.txt", "w");
    convert_io(fout, fin);
    fclose(fin);
    fclose(fout);
*/
    getchar();
    return 0;
}

Объяснение кода листинга программы

  1. Включаем заголовочный файл stdio.h для использования функций ввода-вывода
  2. Функция convert_io принимает два аргумента: файловый указатель для вывода (FILE) и файловый указатель для чтения (FILE)
  3. Внутри функции объявлены две переменные: x типа unsigned short и p типа char*, а также массив s типа char размером 20 символов
  4. В цикле while с условием, что файловый указатель для чтения не равен NULL и нет ошибки при чтении, происходит считывание строки из файла в массив s
  5. Внутри цикла for происходит перевод двоичного числа в десятичное, сдвигая значение переменной x на 1 влево и добавляя значение, соответствующее текущему символу ('0' или '1'), к общему значению x
  6. Если при записи десятичного числа в файл возникает ошибка (меньше нуля), то цикл прерывается
  7. После окончания цикла выполняется запись в файл с помощью функции fflush
  8. В функции main создается файловый указатель fin для открытия файла file.txt в режиме чтения
  9. Если файл успешно открыт, то вызывается функция convert_io с аргументами stdout (вывод в консоль) и fin (файловый указатель для чтения)
  10. Затем файловый указатель fin закрывается с помощью функции fclose
  11. Комментарий описывает аналогичный вывод из файла input.txt в файл output.txt, но эта часть кода не выполняется в данном примере
  12. В конце программы вызывается функция getchar для чтения символа из консоли и функция main возвращает 0, что означает успешное завершение программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5
Похожие ответы