游程编码算法[数据压缩]

时间:2018-01-09 16:59:20

标签: c++

我试图用简单的输入实现算法RLE,如:

Paul 46
Sarah 46

代码:

ddddddddddhhhhhhhhhhhhhhhttttttttttttt

我得到的输出是:

#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

int main() {

    vector<char> read;

    ifstream file;
    file.open("file.txt");

    if (!file) {
        cout << "Unable to open";
    }

    char v;

    while(file>>v) {
        read.push_back(v);
    }

    char x;
    int count=0;

    for(int i=0; i<read.size(); i++) {

        x = read[i];

        if(x != read[++i]) {
          cout << x << "1";
        }

        while(x == read[++i]) {
            count++;
        }
        cout << x << count;

        count = 0;
    }


    return 0;
}

请帮我解释一下代码。

更新:我已经更新了这个问题,因为我已经意识到了一些事情。

加号:这段代码没有输出,有什么不对的我做错了吗?

d9d1h12h1t10t1

1 个答案:

答案 0 :(得分:0)

这个循环:

define

有几个错误。首先,您应该使用两个索引char x; int count=0; for(int i=0; i<read.size(); i++) { int j=i; x = read[i]; if(x != read[++j]) { cout << x << "1"; } while(x == read[++j]) { count++; } cout << x << count; } ij正在遍历i的每个元素,但是read也会遍历子序列。你想要的只是通过每个元素一次,并在每种情况下打印或增加计数。但是,使用for循环并将索引移入其中也不是一个很好的做法,而是容易出错。此外,你必须j语句不能在正确的时间运行(你不想在每次迭代时打印一些东西,只有当角色改变时)。您可以使用while循环,或使用更简单的结构:

cout