4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
1

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

12.06.2018, 05:13. Показов 788. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2018, 05:13
Ответы с готовыми решениями:

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

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

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

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

12
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
12.06.2018, 08:46 2
По заданию у тебя функция один символ принимает и величину сдвига. Где это?
Избавься от feof().
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
12.06.2018, 11:01  [ТС] 3
nmcf, точно, забыл сказать, переменные для функций мне дали разрешение указывать на мое усмотрение в той же функции. feof там указан потому что я взял готовую конструкцию для записи из одного файла в другой, и думал просто в процессе изменить эту конструкцию для того что бы перед тем как записывать в результирующий файл проводить манипуляции с символами
0
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
12.06.2018, 11:06 4
Даже если так. У тебя есть два бесполезных параметра FILE, но отсутствует величина сдвига.
И избавься от feof(), откуда ты это взял? Вставь fread() в условие цикла - пока возвращает число больше нуля.
И где сам сдвиг?
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
12.06.2018, 17:35  [ТС] 5
nmcf, чем принципиально менять feof() на fread()? и сдвиг будет когда мне кто-то подскажет как обратиться к КАЖДОМУ символу текста, для того что бы сделать побитовый сдвиг вправо?
0
7275 / 6220 / 2833
Регистрация: 14.04.2014
Сообщений: 26,871
12.06.2018, 17:37 6
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
чем принципиально менять feof() на fread()?
Прочитай как feof() работает.
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
как обратиться к КАЖДОМУ символу текста
У тебя же массив. Вот и обращайся к элементам.
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
14.06.2018, 00:58  [ТС] 7
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
2758 / 1912 / 569
Регистрация: 05.06.2014
Сообщений: 5,561
14.06.2018, 02:05 8
Цитата Сообщение от 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  [ТС] 9
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  [ТС] 10
Renji, при тесте программы понял, что нужно изменять, то чтение из файла которое вы посоветовали, потому что, при кодировке символа h на выходе я получаю символ "конец строки", последующая правильная декодировка невозможна.
0
2758 / 1912 / 569
Регистрация: 05.06.2014
Сообщений: 5,561
16.06.2018, 02:31 11
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
Renji, при тесте программы понял, что нужно изменять, то чтение из файла которое вы посоветовали, потому что, при кодировке символа h на выходе я получаю символ "конец строки", последующая правильная декодировка невозможна.
Поменяли тип возвращаемого decode значения с int на char? Потому как в моем варианте вы должны получать в файле не "символ", а его код в текстовом виде.
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
16.06.2018, 03:18  [ТС] 12
Renji, да, поменял. Решил проблему открытием файла в двоичном режиме. Но теперь, после декода в конце каждой строки появилась "4".
0
2758 / 1912 / 569
Регистрация: 05.06.2014
Сообщений: 5,561
16.06.2018, 03:56 13
Так вам что на выходе получить нужно - коды символов в текстовом виде или символы с заданным кодом? Если второе, то:
C++
1
2
while(in.peek()!=EOF)
    out.put(decode(in.get()));
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2018, 03:56
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru