我有一个char*和我从库中收到的数据长度,我需要将数据传递给一个带有istream的函数.
我知道我可以创建一个字符串流但是会复制所有数据.而且,数据肯定会有0,因为它是一个zip文件,创建一个字符串流将把数据带到我认为的第一个0.
有没有办法从char*创建一个istream,它的大小没有复制所有数据?
我试图将文件映射到内存然后逐行解析 - istream我应该使用什么?
istream是否与在Windows上将文件映射到内存相同?我在寻找将文件映射到内存的完整示例时遇到了困难.
我见过人们链接来自MSDN的内存映射文章,但是如果有人可以推荐一个小的(~15行?)示例我会非常感激.
我一定在寻找错误的东西,但是当在Google上搜索"C++内存映射示例"时,我找不到包含迭代的示例.
这些是最接近的结果(只是让人们意识到我已经看过):
据我了解,在Qt应用程序中打包非代码资源(如数据文件)的方法是使用资源系统.但是,如果我想使用非Qt函数访问资源该怎么办?例如,我可能有一个.txt或.csv文件,其中包含一些我想使用ifstream访问的应用程序数据.似乎不能使用":..."语法代替非Qt函数和类的文件名.是否有单独的工作流程来打包应用程序中非Qt函数使用的数据?
我正在使用OSX,但我认为这些问题与平台无关.
我正在添加通过网络获取数据的能力,以便只读取本地文件的代码.我正在使用的网络库以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)
有没有办法做到这一点,还是我咆哮错误的树?
如何使用boost解压缩bzip2压缩的字节数组?我在这里找到了一个例子,但输入是一个文件,因此使用ifstream.文档对我来说不是很清楚:(.
编辑:我会接受提升的替代方案.
我知道你不能std::string从std::ostringstream没有复制中提取一个(从常量内存创建输入流).
但是有可能得到一个std::string_view吗?
我想在运行时创建istream,QByteArray而不将物理文件保存在QByteArray.
我发现有很多方法可以进行相反的转换,即istream到QByteArray,但不是这个。
如何做到这一点?
我正在尝试采用复杂的嵌套结构,并将其直接存储在.cpp文件中作为静态数据.我想采取的方法是获取我的对象(已经支持Boost序列化)并将其作为二进制存档序列化为字节数组.然后,我可以获取该字节数组,并遍历它以自动生成所需的.cpp代码以保存二进制数组.然后,我想从该字节数组反序列化回到对象中.
所以基本上,在一天结束时我会喜欢这样的事情:
unsigned char* my_obj = { 10, 48, 48, 30, 20 ... }
Run Code Online (Sandbox Code Playgroud)
当我想使用那些数据时,我只是将它包装在"字节流"中并再次传递给Boost以反序列化回我的实际对象.
我的问题是:是否有一些简单的方法将字节数组作为流传递?Boost处理istreams和ostreams来读取和编写档案.我不想使用字符串流或文件流,而是我想可能是一个自定义流,它只是作为传递给它的任何东西的巨大字节数组.
我觉得应该有一个很好的方法来创建这个自定义流并让它与Boost序列化无缝地工作......我只是不确定从哪里开始?
问题
有一个巨大的文件(10GB),一个必须读取文件并打印出k在文件中重复完整次数的单词数
我的解决方案
ifstream逐字读取文件;std::map<std::string, long> mp; mp[word] += 1;k时间题
文件信息
将内存流上的答案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:这个问题的方向相同,但是给出了更具体的答案。
我有一个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++样式转换来执行此转换而不嵌套两个单独的转换操作?
我无法提供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_view对std::basic_string。构造函数正在basic_string根据错误消息进行操作。 …