相关疑难解决方法(0)

从char获取一个istream*

我有一个char*和我从库中收到的数据长度,我需要将数据传递给一个带有istream的函数.

我知道我可以创建一个字符串流但是会复制所有数据.而且,数据肯定会有0,因为它是一个zip文件,创建一个字符串流将把数据带到我认为的第一个0.

有没有办法从char*创建一个istream,它的大小没有复制所有数据?

c++ istream

51
推荐指数
5
解决办法
4万
查看次数

istream vs内存映射文件?

我试图将文件映射到内存然后逐行解析 - istream我应该使用什么?

istream是否与在Windows上将文件映射到内存相同?我在寻找将文件映射到内存的完整示例时遇到了困难.

我见过人们链接来自MSDN的内存映射文章,但是如果有人可以推荐一个小的(~15行?)示例我会非常感激.

我一定在寻找错误的东西,但是当在Google上搜索"C++内存映射示例"时,我找不到包含迭代的示例.

这些是最接近的结果(只是让人们意识到我已经看过):

c++

12
推荐指数
1
解决办法
2万
查看次数

如何从非Qt函数访问Qt资源数据

据我了解,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统.但是,如果我想使用非Qt函数访问资源该怎么办?例如,我可能有一个.txt或.csv文件,其中包含一些我想使用ifstream访问的应用程序数据.似乎不能使用":..."语法代替非Qt函数和类的文件名.是否有单独的工作流程来打包应用程序中非Qt函数使用的数据?

我正在使用OSX,但我认为这些问题与平台无关.

c++ qt packaging

10
推荐指数
1
解决办法
2347
查看次数

如何从uint8_t向量创建istream?

我正在添加通过网络获取数据的能力,以便只读取本地文件的代码.我正在使用的网络库以a的形式发送和接收数据vector<uint8_t>.我希望能够在读取文件后重用处理数据的代码,但该代码需要std :: istream,有没有办法让istream读取矢量数据?这是相同的数据,所以我觉得应该有办法,但我无法找到或找出如何做的代码.

当前代码:

    std::ifstream stream("data.img", std::ios::in | std::ios::binary | std::ios::ate);

    if (!stream.is_open())
    {
        throw std::invalid_argument("Could not open file.");
    }
    // the arg for processData is std::istream
    processData(stream);
Run Code Online (Sandbox Code Playgroud)

网络框架:

    vector<uint8_t> data = networkMessage.data;

    // need some way to create istream from data
    std::istream stream = ?

    processData(stream);
    stream.close();
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,还是我咆哮错误的树?

c++

9
推荐指数
1
解决办法
1623
查看次数

解压缩bzip2字节数组

如何使用boost解压缩bzip2压缩的字节数组?我在这里找到了一个例子,但输入是一个文件,因此使用ifstream.文档对我来说不是很清楚:(.

编辑:我会接受提升的替代方案.

c++ boost bzip2

5
推荐指数
1
解决办法
2206
查看次数

有没有从std :: ostringstream获取std :: string_view而无需复制的方法?

我知道你不能std::stringstd::ostringstream没有复制中提取一个(从常量内存创建输入流).

但是有可能得到一个std::string_view吗?

c++ iostream c++17

5
推荐指数
1
解决办法
410
查看次数

如何将 QByteArray 转换为 std::istream 或 std::ifstream?

我想在运行时创建istreamQByteArray而不将物理文件保存在QByteArray.

我发现有很多方法可以进行相反的转换,即istreamQByteArray,但不是这个。

如何做到这一点?

c++ qt std istream qbytearray

3
推荐指数
1
解决办法
2800
查看次数

使用Boost和IOStreams序列化为静态数据

我正在尝试采用复杂的嵌套结构,并将其直接存储在.cpp文件中作为静态数据.我想采取的方法是获取我的对象(已经支持Boost序列化)并将其作为二进制存档序列化为字节数组.然后,我可以获取该字节数组,并遍历它以自动生成所需的.cpp代码以保存二进制数组.然后,我想从该字节数组反序列化回到对象中.

所以基本上,在一天结束时我会喜欢这样的事情:

unsigned char* my_obj = { 10, 48, 48, 30, 20 ... }
Run Code Online (Sandbox Code Playgroud)

当我想使用那些数据时,我只是将它包装在"字节流"中并再次传递给Boost以反序列化回我的实际对象.

我的问题是:是否有一些简单的方法将字节数组作为流传递?Boost处理istreams和ostreams来读取和编写档案.我不想使用字符串流或文件流,而是我想可能是一个自定义流,它只是作为传递给它的任何东西的巨大字节数组.

我觉得应该有一个很好的方法来创建这个自定义流并让它与Boost序列化无缝地工作......我只是不确定从哪里开始?

c++ serialization boost bytearray

2
推荐指数
1
解决办法
2642
查看次数

读一个大文件来计算重复K次的单词数

问题

有一个巨大的文件(10GB),一个必须读取文件并打印出k在文件中重复完整次数的单词数

我的解决方案

  1. 用于ifstream逐字读取文件;
  2. 将单词插入地图 std::map<std::string, long> mp; mp[word] += 1;
  3. 一旦文件被读取,找到所有词语的地图,让存在的话k时间


  1. 如何使用多线程有效地读取文件[由块读取]?或任何提高读取速度的方法.
  2. 除了map之外是否有更好的数据结构可以有效地找到输出?

文件信息

  1. 每行最长可达500字
  2. 每个单词最多可以有100个字符长度

c++ fstream data-structures c++14

2
推荐指数
1
解决办法
116
查看次数

如何在内存缓冲区中实现seekg / seekpos?

内存流上的答案seekoff上的答案结合在一起,我实现了内存中的缓冲区,如下所示:

struct membuf : std::streambuf {
    membuf(char const* base, size_t size) {
        char* p(const_cast<char*>(base));
        this->setg(p, p, p + size);
    }
};
struct imemstream : virtual membuf, std::istream {
    imemstream(char const* base, size_t size) :
        membuf(base, size),
        std::istream(static_cast<std::streambuf*>(this)) {
    }

    std::iostream::pos_type seekoff(std::iostream::off_type off,
                                    std::ios_base::seekdir dir,
                                    std::ios_base::openmode which = std::ios_base::in) {
        if (dir == std::ios_base::cur) gbump(off);
        return gptr() - eback();
    }
};
Run Code Online (Sandbox Code Playgroud)

然而,在第一aswer的意见作为解释,我们仍然需要得到seekg/ seekpos工作。那么如何在seekpos这里正确实现呢?

PS:这个问题的方向相同,但是给出了更具体的答案。

c++ buffer iostream

1
推荐指数
1
解决办法
699
查看次数

如何将const uint8_t*转换为char*

我有一个const uint8_t*我想要转换为一个char*期望a的接口char*.

最简单的方法是使用C风格的强制转换:

const uint8_t* aptr = &some_buffer;
char* bptr = (char*)aptr;
Run Code Online (Sandbox Code Playgroud)

但是,我们的内部样式指南(基于Google C++样式指南)禁止C样式转换.

另一种选择是这种怪异,我发现这是非常难以理解的:

char *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(aptr));
Run Code Online (Sandbox Code Playgroud)

我尝试的其他选项都无法编译:

char* dptr = reinterpret_cast<char*>(aptr);
char* eptr = const_cast<char*>(aptr);
char* fptr = static_cast<char*>(aptr);
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以使用C++样式转换来执行此转换而不嵌套两个单独的转换操作?

c++ casting

1
推荐指数
2
解决办法
1390
查看次数

使用string_view构造istringstream不会编译

我无法提供std::string_viewto std::istringstream的构造函数。以下代码无法编译(使用Clang v8启用C ++ 17):

std::string_view val = "Hello";
std::istringstream ss(val, std::ios_base::in);
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

prog.cc:9:24: error: no matching constructor for initialization of 'std::istringstream' (aka 'basic_istringstream<char>')
    std::istringstream ss(val, std::ios_base::in);
                       ^  ~~~~~~~~~~~~~~~~~~~~~~
/opt/wandbox/clang-6.0.0/include/c++/v1/sstream:651:14: note: candidate constructor not viable: no known conversion from 'std::string_view' (aka 'basic_string_view<char>') to 'const std::__1::basic_istringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::string_type' (aka 'const basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >') for 1st argument
    explicit basic_istringstream(const string_type& __s,
             ^
Run Code Online (Sandbox Code Playgroud)

但是这样做:

std::string_view val = "Hello";
std::istringstream ss(val.data(), std::ios_base::in);
Run Code Online (Sandbox Code Playgroud)

这个问题是怪我,因为这里只有1应该发生在这里的隐式转换:std::string_viewstd::basic_string。构造函数正在basic_string根据错误消息进行操作。 …

c++ c++17

1
推荐指数
2
解决办法
131
查看次数