Банальный перевод из двоичной в десятичную и запись в файл - 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; }
Объяснение кода листинга программы
- Включаем заголовочный файл stdio.h для использования функций ввода-вывода
- Функция convert_io принимает два аргумента: файловый указатель для вывода (FILE) и файловый указатель для чтения (FILE)
- Внутри функции объявлены две переменные: x типа unsigned short и p типа char*, а также массив s типа char размером 20 символов
- В цикле while с условием, что файловый указатель для чтения не равен NULL и нет ошибки при чтении, происходит считывание строки из файла в массив s
- Внутри цикла for происходит перевод двоичного числа в десятичное, сдвигая значение переменной x на 1 влево и добавляя значение, соответствующее текущему символу ('0' или '1'), к общему значению x
- Если при записи десятичного числа в файл возникает ошибка (меньше нуля), то цикл прерывается
- После окончания цикла выполняется запись в файл с помощью функции fflush
- В функции main создается файловый указатель fin для открытия файла
file.txt
в режиме чтения - Если файл успешно открыт, то вызывается функция convert_io с аргументами stdout (вывод в консоль) и fin (файловый указатель для чтения)
- Затем файловый указатель fin закрывается с помощью функции fclose
- Комментарий описывает аналогичный вывод из файла
input.txt
в файлoutput.txt
, но эта часть кода не выполняется в данном примере - В конце программы вызывается функция getchar для чтения символа из консоли и функция main возвращает 0, что означает успешное завершение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д