Есть текст (файл text.txt): helowworld Каждый символ кодируется и записывается в файл, в данном случае так (файл kod.txt): 0000001;00000001;000000001;001;0001;0000000001;00000000001;00001;000000000001;0000000000001;00000000000001;1;000000000000001;0000000000000001;0;00000000000000001;000000000000000001;000001;0000000000000000001;00000000000000000001;000000000000000000001;0000000000000000000001;01;00000000000000000000001;000000000000000000000001;0000000000000000000000001; это перечисление кода букв от a-z через ";" Текст кодируется так (файл dekod.txt): 00001000110010100000011001 Вопрос в том, как раскодировать обратно из файла dekod.txt текст, который давался в начале? *на С++
Код каждой буквы (в kod.txt) должен быть одинаковым по длине (n символов), чтобы при раскодировке программа читала по n символов и производила раскодировку.
masterlights, Если бы все коды заканчивались на 1, то можно было бы считываешь до 1, потом искать в таблице по количеству нулей, например, и выводить. Но есть код 0, "0001;0;000", для 'o', если алфивит(коды) задан строго и не тобой, то не вижу решения "в лоб", если алфавит придумывал ты, то поменяй или в dekod.txt разделяй как-то "буквы".
По идее должна быть пирамида, может парсер съел? Code: 0000001;a 00000001;b 000000001;c 001;d 0001;e 0000000001;f 00000000001;g 00001;h 000000000001;i 0000000000001;j 00000000000001;k 1;l 000000000000001;m 0000000000000001;n 0;o 00000000000000001;p 000000000000000001;q 000001;r 0000000000000000001;s 00000000000000000001;t 000000000000000000001;u 0000000000000000000001;v 01;w 00000000000000000000001;x 000000000000000000000001;y 0000000000000000000000001;z
да, код из одного нуля очень мешает, я поменял... теперь код символов выглядит так: a: 00000001 b: 000000001 c: 0000000001 d: 0001 e: 00001 f: 00000000001 g: 000000000001 h: 000001 i: 0000000000001 j: 00000000000001 k: 000000000000001 l: 1 m: 0000000000000001 n: 00000000000000001 o: 01 p: 000000000000000001 q: 0000000000000000001 r: 0000001 s: 00000000000000000001 t: 000000000000000000001 u: 0000000000000000000001 v: 00000000000000000000001 w: 001 x: 000000000000000000000001 y: 0000000000000000000000001 z: 00000000000000000000000001 теперь все символы оканчиваются на 1 а как реализовать код, что бы он доходил до 1 и копировал в массив? я попробовал так: Code: ifstream fin("D:\\kod\\dekod.txt"); while(fin.get(ch)) { if(ch==';') i++; else num[i]=num[i]+(ch-'0'); } fin.close(); for(i=0;i<26;i++) { cout<<num[i]<<';'; } но так не работает недавно начал изучать С++, поэтому сори за кривизну
Ну напиши что-нибудь типа Code: #include <iostream> #include <sstream> #include <fstream> #include <vector> #include <map> std::string read_file(const std::string & file_name) { std::ifstream file; std::string content; std::stringstream ss; file.open(file_name, std::ios::in); if(file.is_open()) { ss<<file.rdbuf(); content = ss.str(); file.close(); } return content; } void explode(std::string & str, const std::string & separator, std::vector<std::string> * results) { unsigned int found; found = str.find_first_of(separator); while(found != std::string::npos) { if(found > 0) results->push_back(str.substr(0,found)); str = str.substr(found + 1); found = str.find_first_of(separator); } if(str.length() > 0) results->push_back(str); } int char_count(std::string & str, const char ch) { int cnt = 0; for(std::string::iterator i = str.begin(); i!= str.end(); ++i) if((*i) == ch) cnt++; return cnt; } int main() { std::ifstream k_file, d_file; std::vector<std::string> letters; std::map<int, char> letters_assoc; std::string kod = read_file("kod.txt"); std::string dekod = read_file("dekod.txt"); explode(kod, ";", &letters); for(int i = 'a', j = 0; i <= 'z'; i++, j++) letters_assoc[char_count(letters[j], '0')] = i; int zero_cnt = 0; for(std::string::iterator i = dekod.begin(); i != dekod.end(); ++i) { if((*i) == '1') { std::cout<<letters_assoc[zero_cnt]; zero_cnt = 0; } else { zero_cnt++; } } std::cin.get(); return 0; }
спасибо, работает) но мне кажется, что можно намного проще сделать, м? а то километры кода для несложной задачи
Упрощаем: Code: std::string read_file(const std::string & file_name) { std::ifstream file(file_name); std::string content; if(file) std::copy(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>(), std::back_inserter(content)); return content; } Упрощаем: Code: unsigned int char_count(const std::string & str, const char ch) { return std::count(str.begin(), str.end(), ch); } Подключить еще придется <algorithm> и <iterator>.
раз уж тема про коды, у меня такой трабл когда компилирую программу с отображением символов ascii некоторые символы не отображаются заместо них квадратики или вопросы, другие американские буквы отображаются как сделать отображение? компилятор gcc ос freebsd