Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192

Разработать перечень основных операций с битовыми полями

12.06.2018, 05:13. Показов 1025. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Пишу программу по следующему заданию:

Кликните здесь для просмотра всего текста
Разработать ПО работы с битами. Разработать перечень основных операций с битовыми полями. На основе разработанного ПО, решить задачу перекодировки текстовой строки в строку, содержащую вместо каждого символа его новый числовой код, а также выполняющее декодировку. Правило перекодировки задается функцией int КОД.
Разработать функцию КОД, реализующую следующее правила перекодировки:
1. КОД(char s, int a, int b) - в s переставить биты в позициях a и b;
2. КОД(char s, char M) - вернуть s XOR M;
3. КОД(char s, int a,) - биты s циклически сдвинуть в право на a.
На основе разработанного ПО, реализовать пакетную перекодировку группы текстовых файлов . Имена файлов преобразования выбирать из «файла задания»:
code файл_источник файл_результат
decode файл_источник файл_результат
Имя входного файла «задания» выбрать из параметров командной строки.


Хотелось бы спросить у вас, как в процедуре code обработать каждый символ? Преподаватель разрешил выбрать из трех вариантов обработки один, я решил взять циклический сдвиг вправо.

Надеюсь на вашу помощь. Вот что сделал на данный момент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <ctime>
 
using namespace std;
 
char path[]= "D:\\zadanie.txt";
int err;
 
void logs(char *info,int status);
bool open_file(char *name_input, char *name_output, FILE *h_in, FILE *h_out );
bool get_data(char *buff, char *oper, char *name_input, char *name_output, int i);
void code(char *name_input, char *name_output, FILE *h_in, FILE *h_out);
void decode(char *name_input, char *name_output, FILE *h_in, FILE *h_out);
 
int main()
{
    setlocale(LC_ALL, "Russian_Russia.1251"); // корректное отображение Кириллицы
 
    char buff[512]; // буфер промежуточного хранения считываемого из файла текста
    char oper[10]; //для хранения названия нужной нам операции
    char name_input[255]; //для хранения расположения входного текста
    char name_output[255]; //для хранения выходного текста
    FILE *h_in, *h_out;
 
    logs("начало работы",0); //сообщаем об начале работы
 
    ifstream fin(path); // открыли файл для чтения
    if (!fin.is_open()) // если файл не открыт
        logs("файл с заданием небыл открыт",1); //сделали запись об ошибке
        else
            logs("файл с заданием был успешно открыт",0); //если был открыт то сделали запись
 
    int i=0;
    while(fin){
        fin.getline(buff, 512); // считали строку из файла
 
        if ( buff[0] == '#') {
            // todo ignore str output......
            continue;
        };
 
        i++;
        if ( ! get_data(buff, oper, name_input, name_output, i)  ) {
                continue;
        };
 
        char par[512];
        sprintf(par, "%s %s %s",  oper, name_input, name_output);
        logs(par,0);
 
        open_file(name_input, name_output, h_in, h_out );
 
        if ( strcmp(oper, "decode") == 0 ) {
                decode(name_input, name_output, h_in, h_out);
                continue;
        }else{
            if( strcmp(oper, "code") == 0 ) {
                code(name_input, name_output, h_in, h_out);
                continue;
        }else{
            logs("указанной операции не существует",1);}
        }
  }
 
    fin.close(); // закрываем файл
    (logs("конец работы программы",0));
 
    return 0;
}
 
void logs(char *info, int status){
    char e_path[255];
    sprintf(e_path, "%s.logs.txt", path);//name path logs
    ofstream fout(e_path,ios_base::app); // создаём объект класса ofstream для записи всех действий;
 
    char buffer[80];
    time_t seconds = time(NULL);
    tm* timeinfo = localtime(&seconds);
    char* format = "%H:%M:%S";
    strftime(buffer, 80, format, timeinfo);
 
    if(status==0)
    fout<<"      "<<buffer<< ": "<< info<< endl;
        else{
            fout<< "error "<<buffer << ": " << info<< endl;
            err+=1;
        }
 
     if ( strcmp(info, "конец работы программы") == 0 ) {
            if(err>0){
            cout<< "При работе возникло " << err << " ошибки"<< endl;
            cout<< "Проверьте журнал работы программы ";
            printf(e_path);
        }
     }
}
 
bool get_data(char * buff, char * oper, char * name_input, char * name_output, int i){
   char *p;
   char razdel[]=" ";
 
   char str[20];
   sprintf(str, "%s %d",  "строка №", i);
   logs(str,0);
 
   p = strtok (buff,razdel);
   if ( p != NULL ) { strcpy(oper,p); logs("имя операции полученно",0);}
   else { logs("имя операции не полученно",1); ; return false; };
 
   p = strtok (NULL,razdel);
   if ( p != NULL ) { strcpy(name_input,p); logs("имя исходного файла полученно",0);}
   else { logs("имя исходного файла не полученно",1) ; return false; };
 
   p = strtok (NULL, razdel);
   if ( p != NULL ) { strcpy(name_output,p); logs("имя результирующего файла полученно",0);}
   else { logs("имя результирующего файла не полученно",1) ; return false; };
   return true;
}
 
bool open_file(char *name_input, char *name_output, FILE *h_in, FILE *h_out ){
  h_in=fopen(name_input, "r");
  if ( h_in == NULL ) {
    logs("входной файл не был открыт",1);
    return false;
  }
 
  h_out=fopen(name_output, "w");
  if ( h_in == NULL ) {
    logs("результирующий файл не был открыт",1);
    return false;
  }
 
    logs("файлы открыты для работы ",0);
    return true;
}
 
void code(char *name_input, char *name_output, FILE *h_in, FILE *h_out){
    size_t k;
    char buf[100];
 
    h_in = fopen(name_input,"r");
    h_out= fopen(name_output,"w");
 
    while(!feof(h_in))
    {
        k = fread(buf,sizeof(char),100,h_in);
        fwrite(buf,sizeof(char),k,h_out);
        buf[k]=0;
    }
 
    logs("кодировка прошла успешно",0);
    fclose(h_in);
    fclose(h_out);
}
 
 
void decode(char *name_input, char *name_output, FILE *h_in, FILE *h_out){
        size_t k;
    char buf[100];
 
    h_in = fopen(name_input,"r");
    h_out= fopen(name_output,"w");
 
    while(!feof(h_in))
    {
        k = fread(buf,sizeof(char),100,h_in);
        fwrite(buf,sizeof(char),k,h_out);
        buf[k]=0;
    }
 
    logs("декодировка прошла успешно",0);
    fclose(h_in);
    fclose(h_out);
}
P.S. какие ошибки я допустил во время написания? хотелось бы критику услышать
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.06.2018, 05:13
Ответы с готовыми решениями:

Работа с битовыми полями
Добрый день. Не зная и не понимая подобного... Подскажите пожалуйста, как реализовать ввод класса(число+буква) при помощи битовых полей с...

Структура с битовыми полями
Написать программу, которая реализует сохранение в структуре с битовыми полями времени (часы, минуты, секунды). Написать функцию вычисления...

Размер структуры с битовыми полями
Здравствуйте, имеется структура с битовыми полями (используя директиву #pragma pack (push,1)): struct A { uint8_t b : 7; uint8_t c...

12
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
12.06.2018, 08:46
По заданию у тебя функция один символ принимает и величину сдвига. Где это?
Избавься от feof().
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
12.06.2018, 11:01  [ТС]
nmcf, точно, забыл сказать, переменные для функций мне дали разрешение указывать на мое усмотрение в той же функции. feof там указан потому что я взял готовую конструкцию для записи из одного файла в другой, и думал просто в процессе изменить эту конструкцию для того что бы перед тем как записывать в результирующий файл проводить манипуляции с символами
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
12.06.2018, 11:06
Даже если так. У тебя есть два бесполезных параметра FILE, но отсутствует величина сдвига.
И избавься от feof(), откуда ты это взял? Вставь fread() в условие цикла - пока возвращает число больше нуля.
И где сам сдвиг?
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
12.06.2018, 17:35  [ТС]
nmcf, чем принципиально менять feof() на fread()? и сдвиг будет когда мне кто-то подскажет как обратиться к КАЖДОМУ символу текста, для того что бы сделать побитовый сдвиг вправо?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
12.06.2018, 17:37
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
чем принципиально менять feof() на fread()?
Прочитай как feof() работает.
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
как обратиться к КАЖДОМУ символу текста
У тебя же массив. Вот и обращайся к элементам.
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
14.06.2018, 00:58  [ТС]
nmcf, сегодня был на консультации и был выруган, за то как считывал файл
после чего преподаватель "разложил" и "сложил" на биты. Но честно говоря, я практически ничего не понял, а самое главное, не понимаю, можно ли с этой функцией "kod1" вообще работать с символами, а не только с числами? тяжко мне дается понимание работы с битами(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <ctime>
 
using namespace std;
 
char path[]= "D:\\zadanie.txt";
int err;
 
void logs(char *info,int status);
bool open_file(char *name_input, char *name_output, FILE *h_in, FILE *h_out );
bool get_data(char *buff, char *oper, char *name_input, char *name_output, int i);
void code(char *name_input, char *name_output, FILE *h_in, FILE *h_out);
void decode(char *name_input, char *name_output, FILE *h_in, FILE *h_out);
char kod1(char s);
int main()
{
   // setlocale(LC_ALL, "Russian_Russia.1251"); // корректное отображение Кириллицы
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    char buff[512]; // буфер промежуточного хранения считываемого из файла текста
    char oper[10]; //для хранения названия нужной нам операции
    char name_input[255]; //для хранения расположения входного текста
    char name_output[255]; //для хранения выходного текста
    FILE *h_in, *h_out;
 
    unsigned char x;
    x=0x00; kod1(x);
    x=0xff; kod1(x);
    x=0x03; kod1(x);
    x=0x10; kod1(x);
    x=0x80; kod1(x);
    x=0x05; kod1(x);
    return 0;
 
 
 
    logs("начало работы",0); //сообщаем об начале работы
 
    ifstream fin(path); // открыли файл для чтения
    if (!fin.is_open()) // если файл не открыт
        cout<<"Неудалось открыть файл, проверьте путь!"<<endl; //сделали запись об ошибке
        else
            logs("файл с заданием был успешно открыт",0); //если был открыт то сделали запись
 
    int i=0;
    while(fin){
        fin.getline(buff, 512); // считали строку из файла
 
        if ( buff[0] == '#') {
            // todo ignore str output......
            continue;
        };
 
        i++;
        if ( ! get_data(buff, oper, name_input, name_output, i)  ) {
                continue;
        };
 
        char par[512];
        sprintf(par, "%s %s %s",  oper, name_input, name_output);
        logs(par,0);
 
        open_file(name_input, name_output, h_in, h_out );
 
        if ( strcmp(oper, "decode") == 0 ) {
                decode(name_input, name_output, h_in, h_out);
                continue;
        }else{
            if( strcmp(oper, "code") == 0 ) {
                code(name_input, name_output, h_in, h_out);
                continue;
        }else{
            logs("указанной операции не существует",1);}
        }
  }
 
    fin.close(); // закрываем файл
    (logs("конец работы программы",0));
 
    return 0;
}
 
void logs(char *info, int status){
    char e_path[255];
    sprintf(e_path, "%s.logs.txt", path);//name path logs
    ofstream fout(e_path,ios_base::app); // создаём объект класса ofstream для записи всех действий;
 
    char buffer[80];
    time_t seconds = time(NULL);
    tm* timeinfo = localtime(&seconds);
    char* format = "%H:%M:%S";
    strftime(buffer, 80, format, timeinfo);
 
    if(status==0)
    fout<<"      "<<buffer<< ": "<< info<< endl;
        else{
            fout<< "error "<<buffer << ": " << info<< endl;
            err+=1;
        }
 
     if ( strcmp(info, "конец работы программы") == 0 ) {
            if(err>0){
            cout<< "При работе возникло " << err << " ошибок"<< endl;
            cout<< "Проверьте журнал работы программы ";
            printf(e_path);
        }
     }
}
 
bool get_data(char * buff, char * oper, char * name_input, char * name_output, int i){
   char *p;
   char razdel[]=" ";
 
   char str[20];
   sprintf(str, "%s %d",  "строка №", i);
   logs(str,0);
 
   p = strtok (buff,razdel);
   if ( p != NULL ) { strcpy(oper,p); logs("имя операции полученно",0);}
   else { logs("имя операции не полученно",1); ; return false; };
 
   p = strtok (NULL,razdel);
   if ( p != NULL ) { strcpy(name_input,p); logs("имя исходного файла полученно",0);}
   else { logs("имя исходного файла не полученно",1) ; return false; };
 
   p = strtok (NULL, razdel);
   if ( p != NULL ) { strcpy(name_output,p); logs("имя результирующего файла полученно",0);}
   else { logs("имя результирующего файла не полученно",1) ; return false; };
   return true;
}
 
bool open_file(char *name_input, char *name_output, FILE *h_in, FILE *h_out ){
  h_in=fopen(name_input, "r");
  if ( h_in == NULL ) {
    logs("входной файл не был открыт",1);
    return false;
  }
 
  h_out=fopen(name_output, "w");
  if ( h_in == NULL ) {
    logs("результирующий файл не был открыт",1);
    return false;
  }
 
    logs("файлы открыты для работы ",0);
    return true;
}
 
void code(char *name_input, char *name_output, FILE *h_in, FILE *h_out){
    h_in = fopen(name_input,"r");
    h_out= fopen(name_output,"w");
 
    fseek(h_in , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
    long lSize = ftell(h_in);                            // получаем размер в байтах
    rewind (h_in);                                       // устанавливаем указатель в конец файла
 
    char * buffer = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
    if (buffer == NULL)
    {
        fputs("Ошибка памяти", stderr);
        exit(2);
    }
 
    size_t result = fread(buffer, 1, lSize, h_in);       // считываем файл в буфер
    if (result != lSize)
    {
        fputs("Ошибка чтения", stderr);
        exit (3);
    }
 
    //содержимое файла теперь находится в буфере
    puts(buffer);
    char sm, sm1;
    for(int i=0; i< 4 /*lSize*/; i++ ){
        sm=buffer[i];///='a';
        sm1=kod1(sm);
        printf("sm=<%c> sm1=<%c> %01x  %01x \n", sm, sm1, sm, sm1);
    }
    fputs(buffer, h_out); // записать строку в файл
 
    logs("кодировка прошла успешно",0);
    fclose(h_in);
    fclose(h_out);
}
 
 
void decode(char *name_input, char *name_output, FILE *h_in, FILE *h_out){
    h_in = fopen(name_input,"r");
    h_out= fopen(name_output,"w");
 
    fseek(h_in , 0 , SEEK_END);                          // устанавливаем позицию в конец файла
    long lSize = ftell(h_in);                            // получаем размер в байтах
    rewind (h_in);                                       // устанавливаем указатель в конец файла
 
    char * buffer = (char*) malloc(sizeof(char) * lSize); // выделить память для хранения содержимого файла
    if (buffer == NULL)
    {
        fputs("Ошибка памяти", stderr);
        exit(2);
    }
 
    size_t result = fread(buffer, 1, lSize, h_in);       // считываем файл в буфер
    if (result != lSize)
    {
        fputs("Ошибка чтения", stderr);
        exit (3);
    }
 
    fclose(h_in);
    fclose(h_out);
}
char kod1(char s) {
  unsigned char x;
  unsigned int bit[8];
  unsigned char mask, mask1;
  mask1=0x01;
  for( int i=0;i<8; i++){
      mask=mask1 << i;
      printf( " i=%d mask=%01x  (s & mask)=%01x\n", i, mask,  (s & mask) >> i );
      bit[7-i] = (s & mask) >> i;
  };
  x=s;
  printf("*****  kod1:  s=%01x ", s);
  for( int i=0;i<8; i++){ printf( " %1d ", bit[i]); };
  printf("\n");
 
 
  x=0;
  for( int i=0;i<8; i++)
    x=x*2+ bit[i];
  printf("x=%01x \n", x );
   return x;
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
14.06.2018, 02:05
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
Хотелось бы спросить у вас, как в процедуре code обработать каждый символ?
Для начала выкидываете в форточку учебник Си...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int decode(int value){return value;}//какое-то перекодирование символа
void code(const std::string&inName,const std::string&outName)
{
    std::ifstream in(inName);
    std::ofstream out(outName);
    while(in.peek()!=EOF)
    {
        if(in.peek()=='\n')
            out.put(in.get());
        else
            out<<decode(in.get())<<" ";//выводим в out итоговые коды через пробел
    }
}
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
а самое главное, не понимаю, можно ли с этой функцией "kod1" вообще работать с символами, а не только с числами?
Нельзя. Символы char это такие числа, которые как ни странно бывают отрицательными. А битовые операции над отрицательными числами это где-то между machine dependent и UB. Поэтому нормальные белые люди читают символы через get возвращающий int, там отрицательных кодов символов не будет (кроме EOF, конечно).
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
14.06.2018, 13:15  [ТС]
Renji, решил вот разбить код на отдельные файлы, что можете посоветовать по поводу программы, и если вас не затруднит, подскажите где можно почитать информацию, что бы написать метод который десятичное число(символ) переведет в двоичный вид, сделать сдвиг, и собрать обратно, просто как я понимаю разложить и собрать правильно, это самое сложное.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
///logs.cpp
#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
#include <ctime>
 
 
using namespace std;
 
int err=0; //объявленние переменной для подсчета ошибок
void logs(char *path, char *info, int status){
    int len = strlen(path); //определяем размер пути
    char e_path[len+9];     //путь для файла с логами (путь задания+.logs.txt)
 
    sprintf(e_path, "%s.logs.txt", path);//name path logs
    ofstream fout(e_path,ios_base::app); // создаём объект класса ofstream для записи всех действий;
 
    //настраиваем отображение времени
    char buffer[80];
    time_t seconds = time(NULL);
    tm* timeinfo = localtime(&seconds);
    char* format = "%H:%M:%S";
    strftime(buffer, 80, format, timeinfo);
 
    if(status==0) //если ошибки нет, то...
    fout<<"      "<<buffer<< ": "<< info<< endl;
        else{ //если ошибка есть, то...
            fout<< "error "<<buffer << ": " << info<< endl;
            err+=1;
        }
 
     if ( strcmp(info, "конец работы программы") == 0 ) {
            if(err>0){
            cout<< "При работе возникло " << err << " ошибок"<< endl;
            cout<< "Проверьте журнал работы программы ";
            printf(e_path);
        }
     }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
///get_data.cpp
#include "logs.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <string>
#include <stdlib.h>
 
int i=0;
bool get_data(char *path, char * buff, char * oper, char * name_input, char * name_output){
    char *p;
    char razdel[]=" "; //используемые разделители
 
    //печатаем в логи номер обрабатываемой строки
    i++;
    char str[20];
    sprintf(str, "%s %d",  "строка №", i);
    logs(path,str,0);
 
    p = strtok (buff,razdel);
    if ( p != NULL ) { strcpy(oper,p); logs(path,"имя операции полученно",0);}
    else { logs(path,"имя операции не полученно",1); ; return false; };
 
    p = strtok (NULL,razdel);
    if ( p != NULL ) { strcpy(name_input,p); logs(path,"имя исходного файла полученно",0);}
    else { logs(path,"имя исходного файла не полученно",1) ; return false; };
 
    p = strtok (NULL, razdel);
    if ( p != NULL ) { strcpy(name_output,p); logs(path,"имя результирующего файла полученно",0);}
    else { logs(path,"имя результирующего файла не полученно",1) ; return false; };
    return true;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
///open_file.cpp
#include <fstream>
#include <windows.h>
#include <string>
 
#include "logs.h"
#include "code.h"
#include "decode.h"
 
using namespace std;
 
bool open_file(char *path, char *oper, char *name_input, char *name_output){
    ifstream in(name_input);
    if (!in.is_open()){ // если файл не открыт
        logs(path,"входной файл не был открыт",1); //сделали запись об ошибке
        return false; //выходим из метода
    }
 
    ofstream out(name_output);
    if (!out.is_open()){ // если файл не открыт
        logs(path,"результирующий файл не был открыт",1); //сделали запись об ошибке
        return false;
    }
    logs(path,"файлы открыты для работы ",0);
 
 
    if ( strcmp(oper, "code") == 0 ) {
        while(in.peek()!=EOF)
        {
            if(in.peek()=='\n')
                out.put(in.get());
            else
                out<<code(in.get())<<" ";//выводим в out итоговые коды через пробел
        }
        logs(path,"кодировка выполнена",0);
    }else{
        if( strcmp(oper, "decode") == 0 ) {
            while(in.peek()!=EOF)
            {
                if(in.peek()=='\n')
                    out.put(in.get());
                else
                    out<<decode(in.get())<<" ";//выводим в out итоговые коды через пробел
            }
 
            logs(path,"декодировка выполнена",0);
        }else{
            logs(path,"указанной операции не существует",1);
        }
    }
 
 
    in.close();
    out.close();
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
///code.cpp
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <string>
#include <stdlib.h>
 
#include "logs.h"
#include "get_data.h"
#include "open_file.h"
 
using namespace std;
 
int code(int s) {
 
cout<<s<<endl;
 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
///main.cpp
#include <fstream>
#include <windows.h>
#include <string>
 
#include "logs.h"
#include "get_data.h"
#include "open_file.h"
 
using namespace std;
 
char path[]= "D:\\zadanie.txt";
 
int main()
{
    SetConsoleCP(1251);     //корректное отображение кириллицы
    SetConsoleOutputCP(1251);
 
    char buff[512]; // буфер промежуточного хранения считываемого из файла текста
    char oper[10]; //для хранения названия нужной нам операции
    char name_input[255]; //для хранения расположения входного текста
    char name_output[255]; //для хранения выходного текста
 
    logs(path,"начало работы",0); //сообщаем об начале работы
 
    ifstream fin(path); // открыли файл для чтения
    if (!fin.is_open()){ // если файл не открыт
        printf("%s","Файл с заданием небыл открыт, проверьте путь!"); //сделали запись об ошибке
        }else
            logs(path,"файл с заданием был успешно открыт",0); //если был открыт то сделали запись
 
    while(fin){
        fin.getline(buff, 512); // считали строку из файла
//        if ( buff[0] == '#') {
//            // todo ignore str output......
//            continue;
//        };
 
        if(! get_data(path, buff, oper, name_input, name_output)  ){ //пытаемся получить переменные
            continue; //если не получается начинаем читать новую строку
        }
 
        char par[512];
        sprintf(par, "%s %s %s",  oper, name_input, name_output);
        logs(path,par,0); //записываем в логи операцию и пути которые получилось считать
 
        if (! open_file(path, oper, name_input, name_output) ){ //если не получилось открыть файлы для де/кодировки то начинаем считывать новую строку
            continue;
        }
 
    }
    fin.close(); // закрываем файл
    (logs(path,"конец работы программы",0)); //успешное завершение работы
    return 0;
}
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
16.06.2018, 02:16  [ТС]
Renji, при тесте программы понял, что нужно изменять, то чтение из файла которое вы посоветовали, потому что, при кодировке символа h на выходе я получаю символ "конец строки", последующая правильная декодировка невозможна.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.06.2018, 02:31
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
Renji, при тесте программы понял, что нужно изменять, то чтение из файла которое вы посоветовали, потому что, при кодировке символа h на выходе я получаю символ "конец строки", последующая правильная декодировка невозможна.
Поменяли тип возвращаемого decode значения с int на char? Потому как в моем варианте вы должны получать в файле не "символ", а его код в текстовом виде.
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
16.06.2018, 03:18  [ТС]
Renji, да, поменял. Решил проблему открытием файла в двоичном режиме. Но теперь, после декода в конце каждой строки появилась "4".
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.06.2018, 03:56
Так вам что на выходе получить нужно - коды символов в текстовом виде или символы с заданным кодом? Если второе, то:
C++
1
2
while(in.peek()!=EOF)
    out.put(decode(in.get()));
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2018, 03:56
Помогаю со студенческими работами здесь

Как работать с битовыми полями
В структуре имеется 2 поля: Наименование Авто и уникальный код. значение битов следущие: 0-7 срок эксплутации, 8 был ли авто в аварии,...

Структура Военкомат с битовыми полями
Разработайте структуру, используя битовые поля для обозначения логических (битовых) значений. Структура Военкомат: Фамилия, Имя, Отчество,...

Чтение с файла структуры с битовыми полями
Есть структура: struct Comp { string name; int body:1; int typeVC:1; int typeSC:1; int brandVC:1; int monitor:1; };

Вытащить данные и структуры с битовыми полями
Здравствуйте. Есть нас в одном файле структура, предположим : struct{ short a:2; short b:4; short c:3; } Собственно...

Опубликован перечень основных факторов ранжирования для выдачи Bing
Компания SearchMetrics обнародовала итоги анализа значимости факторов ранжирования для поисковика Bing в 2013 году. Исследование...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru