Банальный перевод из двоичной в десятичную и запись в файл - 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, что означает успешное завершение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д