Вопрос по Си++

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by masterlights, 9 Dec 2011.

  1. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    41
    Likes Received:
    0
    Reputations:
    0
    Есть текст (файл 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 текст, который давался в начале?
    *на С++
     
  2. ~EviL~

    ~EviL~ Elder - Старейшина

    Joined:
    14 Aug 2007
    Messages:
    169
    Likes Received:
    77
    Reputations:
    4
    Код каждой буквы (в kod.txt) должен быть одинаковым по длине (n символов), чтобы при раскодировке программа читала по n символов и производила раскодировку.
     
    1 person likes this.
  3. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    masterlights,
    Если бы все коды заканчивались на 1, то можно было бы считываешь до 1, потом искать в таблице по количеству нулей, например, и выводить. Но есть код 0, "0001;0;000", для 'o', если алфивит(коды) задан строго и не тобой, то не вижу решения "в лоб", если алфавит придумывал ты, то поменяй или в dekod.txt разделяй как-то "буквы".
     
  4. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    По идее должна быть пирамида, может парсер съел?
    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
    
     
  5. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Если я правильно понимаю принцип кодирования, то в dekod.txt закодировано не helowworld
     
    _________________________
  6. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    41
    Likes Received:
    0
    Reputations:
    0
    да, код из одного нуля очень мешает, я поменял...

    теперь код символов выглядит так:

    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]<<';';
    	}
    
    но так не работает
    недавно начал изучать С++, поэтому сори за кривизну
     
  7. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Ну напиши что-нибудь типа
    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;
    }
    
     
    _________________________
  8. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    41
    Likes Received:
    0
    Reputations:
    0
    спасибо, работает)

    но мне кажется, что можно намного проще сделать, м?
    а то километры кода для несложной задачи
     
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Упрощаем:
    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>.
     
  10. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    так правильнее, даже если не проще. вообще раз взялся за c++, то учи STL, без неё никуда
     
  11. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    41
    Likes Received:
    0
    Reputations:
    0
    GRRRL Power, bad_boy
    большое спасибо за помощь ;)
     
  12. -=Dem0n=-

    -=Dem0n=- Elder - Старейшина

    Joined:
    15 Mar 2007
    Messages:
    66
    Likes Received:
    4
    Reputations:
    0
    раз уж тема про коды, у меня такой трабл
    когда компилирую программу с отображением символов ascii
    некоторые символы не отображаются заместо них квадратики или вопросы, другие американские буквы отображаются
    как сделать отображение?
    компилятор gcc
    ос freebsd