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

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

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

Нужна помощь чайнику. Не совсем понимаю, как прописать алгоритм перевода двоичного числа состоящего из 16 символов в каждой строке и последующая его запись в другой файл, в данном случае файл Z2.txt. Также первый символ в файле знаковый, 1 - это "+", а 0 - это "-0" (но это в коде прописано), важно то, что я никак не могу написать правильно алгоритм.
Листинг программы
  1. void conv(int q)
  2. {
  3. int i, j, c;
  4. char z[17];
  5. FILE *f, *fx;
  6. f = fopen("readme.txt", "r");
  7. fx = fopen("Z2.txt", "a");
  8. for (i = 0; i < q; i++)
  9. {
  10. fgets(z, 17, f);
  11. if (z[0] == '1')
  12. {
  13. z[0] = '+';
  14. }
  15. else
  16. {
  17. z[0] = '-';
  18. }
  19. }
  20. for (i = 0; i < q; i++)
  21. {
  22. for (j = 16; j > 0; j--)
  23. {
  24. if (z[j] == '1')
  25. c += pow(2, 16 - (i + 1));
  26. }
  27. }
  28. printf("%d", c);
  29. fclose(f); fclose(fx);
  30. }
у меня при переводе в десятичную просто в любом случае отрицательное число и оно большое, смотрел по калькулятору, даже и близко не совпадает.
Листинг программы
  1. void conv(int q)
  2. {
  3. int i, j, c = 0;
  4. char z[17];
  5. FILE *f, *fx;
  6. f = fopen("readme.txt", "r");
  7. fx = fopen("Z2.txt", "a");
  8. for (i = 0; i < q; i++)
  9. {
  10. fgets(z, 17, f);
  11. if (z[0] == '1')
  12. {
  13. z[0] = '+';
  14. }
  15. else
  16. {
  17. z[0] = '-';
  18. }
  19. }
  20. for (i = 0; i < q; i++)
  21. {
  22. for (j = 16; j > 0; j--)
  23. {
  24. if (z[j] == '1')
  25. {
  26. c += pow(2,j);
  27. }
  28. }
  29. printf("%d", c);
  30. }
  31. fclose(f); fclose(fx);
  32. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. void convert_io(FILE* _out, FILE* _in){
  4.     unsigned short x;
  5.     char* p, s[20];
  6.  
  7.     while(((p = fgets(s, 19, _in)) != NULL) && !ferror(_in)){
  8.         for(x = 0; *p == '0' || *p == '1'; ++p)
  9.             x = (x << 1) | (unsigned short)(*p - '0');
  10.        
  11.         if(fprintf(_out, "%u\n", x) <= 0)
  12.             break;
  13.     }
  14.     fflush(_out);
  15. }
  16.  
  17. int main(void){
  18.     FILE* fout, *fin;
  19.     //вывод из файла в консоль
  20.     if((fin = fopen("file.txt", "r")) != NULL){
  21.         convert_io(stdout, fin);
  22.         fclose(fin);
  23.     }
  24.  
  25. /*     вывод из файла в другой файл
  26.     fin  = fopen("input.txt", "r");
  27.     fout = fopen("output.txt", "w");
  28.     convert_io(fout, fin);
  29.     fclose(fin);
  30.     fclose(fout);
  31. */
  32.     getchar();
  33.     return 0;
  34. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы