gtkmm中是否有一个从FileInputStream读取的函数,该函数可随后用于设置TextArea

v010dya

我正在尝试从文件中读取文本并将其放在TextView中。FileInputStream具有read_bytes,可以set_textTextBuffer中使用ustring,但是似乎没有办法从一个过渡到另一个。

在InputStream的子类中,我发现DataInputStream确实read_line_utf8提供了一个std :: string(总比没有好),但即使DataInputStream也位于FileInputStream的单独的类层次结构分支上。

当然,从理论上讲,可以循环遍历返回的字节数组read_bytes并将其转换为字符,但是以某种方式,我只是拒绝相信我没有忽略的现成函数。

最终,我正在寻找一个可以接受Glib::RefPtr<Glib::Bytes>并返回给我的函数Glib::ustring

v010dya

好吧,在四处搜寻之后,我设法确认在gtkmm库的范围内没有办法这样做。这对我来说确实很奇怪,但是确实如此。

因此,这是通过普通工具读取文件,然后转换已读取内容并在TextArea中显示的方法:

我在这里假设您已经打开对话框并连接了所有需要连接的对话框。如果您有一个Controller类,您将得到以下结果:

fh = dialog->get_file();
fh->read_async( sigc::mem_fun( *this, &Controller::on_file_read_complete ));

确保您具有Glib::RefPtr< Gio::File > fh;私有数据成员身份,而不是本地变量成员身份。然后,您将需要一个功能on_file_read_complete

void Controller::on_file_read_complete(Glib::RefPtr<Gio::AsyncResult>& res)
{
    Glib::RefPtr<Gio::InputStream> fin = fh->read_finish(res);

    Glib::RefPtr<Glib::Bytes> fbytes = fin->read_bytes(8192, Glib::RefPtr<Gio::Cancellable>());
    Glib::ustring str = bytesToUstring(fbytes);

    Gtk::TextView *textview = NULL;

    refGlade->get_widget("textviewUser", textview);
    assert(textview!=NULL);


    textview->get_buffer()->set_text(str);
}

读取文件后,此功能将触发,您可以放心地与通话FileInputStream使用该类的父级函数,在read_bytes这里我要求读取8192个字节,但可能更多,Cancellable必须提供引用,但像上面的情况一样可以为空。现在最棘手的部分,抓住Glib::RefPtr<Glib::Bytes>并使用为此编写的函数进行转换:

Glib::ustring bytesToUstring(Glib::RefPtr<Glib::Bytes> data)
{
    Glib::ustring result = "";

    gsize s;
    gconstpointer d = g_bytes_get_data(data->gobj(), &s);

    unsigned char c;
    wchar_t wc;
    unsigned short toread = 0;
    for(int i=0; i<(int)s; ++i)
    {
        c = ((char*)d)[i];

        if((c >> 7) == 0b0)
        {
            //std::cout << "Byte 0b0" << std::endl;
            if(toread!=0)
            {
                std::cerr << "Help. I lost my place in the stream" << std::endl;
            }
            wc = (wchar_t)c;
        }
        else if((c >> 6) == 0b10)
        {
            //std::cout << "Byte 0b10" << std::endl;
            if(toread==0)
            {
                std::cerr << "Help. I lost my place in the stream" << std::endl;
            }
            wc <<= 6; // 6 more bits are coming in
            wc |= (c & 0b00111111);
            --toread;
        }
        else // we can be sure that we have something starting with at least 2 set bits
        {
            if(toread!=0)
            {
                std::cerr << "Help. I lost my place in the stream" << std::endl;
            }

            if((c >> 5) == 0b110)
            {
                //std::cout << "Byte 0b110" << std::endl;
                wc = c & 0b00011111;
                toread = 1;
            }
            else if((c >> 4) == 0b1110)
            {
                //std::cout << "Byte 0b1110" << std::endl;
                wc = c & 0b00001111;
                toread = 2;
            }
            else if((c >> 3) == 0b11110)
            {
                //std::cout << "Byte 0b11110" << std::endl;
                wc = c & 0b00000111;
                toread = 3;
            }
            else if((c >> 2) == 0b111110)
            {
                //std::cout << "Byte 0b111110" << std::endl;
                wc = c & 0b00000011;
                toread = 4;
            }
            else if((c >> 1) == 0b1111110)
            {
                //std::cout << "Byte 0b1111110" << std::endl;
                wc = c & 0b00000001;
                toread = 5;
            }
            else // wtf?
            {
                std::cerr << "Help! Something is probaby not a UTF-8 at all" << std::endl;
                for(int j=(8*(int)sizeof c) - 1; j>=0; --j)
                {
                    std::cerr << (char)('0'+ (char)((c >> j) & 1));
                }
                std::cerr << std::endl;
            }

        }

        if(toread == 0)
        {
            result += (gunichar)wc;
            wc = L'\0';
            //std::cout << i << ' ' << result << std::endl;
        }
    }
    return result;
}

在这里,我们首先必须抓住真正的字节指针,因为Glib::Bytes它将拒绝为您提供所需的工具。然后,您可以开始转换成wchar_t该过程并不那么困难,并且在有关UTF-8的Wikipedia文章中对此进行了很好的描述。

幸运的是,wchar_t可以将转换为gunichar,然后可以将其添加到Glib::ustring

因此,我们必须走的路是:

对话框-> Gio :: File-> Glib :: Bytes-> gconstpointer-> char->(组合多个字符)wchar_t-> gunichar-> Glib :: ustring->(添加到TextArea的TextBuffer中)

:注意:目前这不是一个立即可用的代码,它只能读取8192字节,因此无法读取更多内容,因为不能保证在两次读取之间字符不会被破坏,也许我稍后再更新代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

gtkmm中是否有一个从FileInputStream读取的函数,该函数可随后用于设置TextArea

来自分类Dev

Prelude中是否有一个函数将值与应用于该函数的值配对?

来自分类Dev

制作一个函数,该函数仅读取一个具有 2 列的矩阵作为输入

来自分类Dev

如何正确设置一个函数,该函数返回python中的年份差异?

来自分类Dev

创建一个函数,该函数从文本文件中读取所有代码行,并将每一行放入元组中。-Python 3

来自分类Dev

集成一个函数,该函数具有R中的参数

来自分类Dev

尝试实现一个函数,该函数从python的链表中删除所有出现的值

来自分类Dev

我正在寻找一个函数,该函数有助于在python中的特定特殊字符后从文件读取字符串

来自分类Dev

是否可以在Haskell中创建一个函数,该函数返回数据类型的构造函数列表?

来自分类Dev

是否可以在Haskell中创建一个函数,该函数返回数据类型的构造函数列表?

来自分类Dev

如何使该函数在模板上的另一个函数内用于blaze模板?

来自分类Dev

当从另一个函数中调用该函数时,如何抑制该函数中的代码行?

来自分类Dev

如何在Scala中定义函数,该函数返回一个函数,该函数本身返回一个函数

来自分类Dev

在Python中,给定一个函数名称,如何获取包含该函数的所有模块?

来自分类Dev

矩阵:在MATLAB中编写一个函数,该函数返回满足以下属性的所有正整数

来自分类Dev

如何在c ++中创建一个函数,该函数具有由参数确定的矩阵大小?

来自分类Dev

在Swift中声明一个函数,该函数返回带有通用T.Type的闭包

来自分类Dev

编写一个函数,该函数可再现与R中的“单独” dplyr函数相同的输出

来自分类Dev

我可以创建一个函数,该函数是对象中函数的属性吗?

来自分类Dev

是否有内置的Python函数,当将函数映射到可迭代对象时,该函数将返回第一个True-ish值?

来自分类Dev

使用泛型创建一个函数,该函数将在Swift中返回另一个函数

来自分类Dev

使用泛型创建一个函数,该函数将在Swift中返回另一个函数

来自分类Dev

Typescript返回一个函数,该函数返回具有类型约束的组件

来自分类Dev

编写一个递归函数,该函数返回具有最长连续序列的数字

来自分类Dev

是否需要为C ++中的一个或几个函数设置一个类

来自分类Dev

在bash函数中定义一个本地数组,并在该函数之外访问它

来自分类Dev

如何在vba函数中打开另一个表单并返回该函数

来自分类Dev

定义一个名为articleStats()的函数,该函数带有一个名为fileName的字符串参数

来自分类Dev

在Postgres中创建一个触发器函数,该函数不允许您有两个具有相同ID的条目

Related 相关文章

  1. 1

    gtkmm中是否有一个从FileInputStream读取的函数,该函数可随后用于设置TextArea

  2. 2

    Prelude中是否有一个函数将值与应用于该函数的值配对?

  3. 3

    制作一个函数,该函数仅读取一个具有 2 列的矩阵作为输入

  4. 4

    如何正确设置一个函数,该函数返回python中的年份差异?

  5. 5

    创建一个函数,该函数从文本文件中读取所有代码行,并将每一行放入元组中。-Python 3

  6. 6

    集成一个函数,该函数具有R中的参数

  7. 7

    尝试实现一个函数,该函数从python的链表中删除所有出现的值

  8. 8

    我正在寻找一个函数,该函数有助于在python中的特定特殊字符后从文件读取字符串

  9. 9

    是否可以在Haskell中创建一个函数,该函数返回数据类型的构造函数列表?

  10. 10

    是否可以在Haskell中创建一个函数,该函数返回数据类型的构造函数列表?

  11. 11

    如何使该函数在模板上的另一个函数内用于blaze模板?

  12. 12

    当从另一个函数中调用该函数时,如何抑制该函数中的代码行?

  13. 13

    如何在Scala中定义函数,该函数返回一个函数,该函数本身返回一个函数

  14. 14

    在Python中,给定一个函数名称,如何获取包含该函数的所有模块?

  15. 15

    矩阵:在MATLAB中编写一个函数,该函数返回满足以下属性的所有正整数

  16. 16

    如何在c ++中创建一个函数,该函数具有由参数确定的矩阵大小?

  17. 17

    在Swift中声明一个函数,该函数返回带有通用T.Type的闭包

  18. 18

    编写一个函数,该函数可再现与R中的“单独” dplyr函数相同的输出

  19. 19

    我可以创建一个函数,该函数是对象中函数的属性吗?

  20. 20

    是否有内置的Python函数,当将函数映射到可迭代对象时,该函数将返回第一个True-ish值?

  21. 21

    使用泛型创建一个函数,该函数将在Swift中返回另一个函数

  22. 22

    使用泛型创建一个函数,该函数将在Swift中返回另一个函数

  23. 23

    Typescript返回一个函数,该函数返回具有类型约束的组件

  24. 24

    编写一个递归函数,该函数返回具有最长连续序列的数字

  25. 25

    是否需要为C ++中的一个或几个函数设置一个类

  26. 26

    在bash函数中定义一个本地数组,并在该函数之外访问它

  27. 27

    如何在vba函数中打开另一个表单并返回该函数

  28. 28

    定义一个名为articleStats()的函数,该函数带有一个名为fileName的字符串参数

  29. 29

    在Postgres中创建一个触发器函数,该函数不允许您有两个具有相同ID的条目

热门标签

归档