这应该是相当普遍的但我发现我找不到任何直接的解决方案令人着迷.
基本上我通过网络将文件读入字符串流.这是声明:
std::stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);
Run Code Online (Sandbox Code Playgroud)
现在我有一些C库需要直接访问内存的读取块.我怎么做到的?只读访问权限就可以了.C函数完成后,我处理了内存流,不需要它.
str() 复制缓冲区,这似乎是不必要的,并使内存翻倍.
我错过了一些明显的东西吗 也许一个不同的stl类可以更好地工作.
编辑:显然,不保证stringstream连续存储.什么是?
如果我使用vector<char>如何获得字节缓冲区?
我需要将文件复制到字符串中.我需要为该字符串对象预先分配内存以及直接将文件内容读入该字符串内存的方法吗?
我想将文本文件的内容加载到vector<char>(或任何char输入迭代器中,如果可能的话).目前我的代码如下所示:
std::vector<char> vec;
std::ifstream file("test.txt");
assert(file.is_open());
while (!(file.eof() || file.fail())) {
char buffer[100];
file.read(buffer, 100);
vec.insert(vec.end(), buffer, buffer + file.gcount());
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢手动使用缓冲区(为什么100个字符?为什么不是200个,或者25个或者其他什么?),或者这个用了大量的行.代码看起来非常丑陋而且非C++.有更直接的方法吗?
我的问题如下:Martin York在此声称,这个,并且这个答案可以stringstream通过使用basic_stringbuf::pubsetbuf这样的方式从一些内存中读取:
char buffer[] = "123";
istringstream in;
in.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); // calls basic_stringbuf::setbuf
int num;
in >> num; // reads 123
Run Code Online (Sandbox Code Playgroud)
不幸的是,我挖掘了整个标准,无法确定它在哪里工作.我看到的只是实现定义.实际上在微软的实现上(也许在其他人的实现上),这个调用没有任何效果.
以下是我在上一篇C++ 0x草案中找到的相关引文.对于basic_streambuf::setbuf[streambuf.virt.buffer]:
1 效果:以本条款(27.8.1.4,27.9.1.5)中从basic_streambuf派生的每个类别单独定义的方式影响流缓冲.
2 默认行为: 什么都不做.返回此.
但是在派生类中,它似乎保留了行为实现定义.因为basic_stringbuf::setbuf它说[stringbuf.virtuals]:
1 效果: 实现定义,但setbuf(0,0)无效.
因为basic_filebuf::setbuf它说[filebuf.virtuals]:
12 效果:如果setbuf(0,0)[...],则流变为无缓冲.否则结果是实现定义的."无缓冲"[...]
就是这样.所以我看到它,一个有效的实现可以完全忽略这些调用(对于非null参数).
我错了吗?这个标准的正确解释是什么?C++ 98/03/0x有相同的保证吗?您是否有更多关于上述代码的哪些实现以及不适用的实现的统计信息?如何basic_streambuf::setbuf使用?
我有简单的文本文件加载到内存中.我想从内存中读取,就像我从像这里的光盘中读到的那样:
ifstream file;
string line;
file.open("C:\\file.txt");
if(file.is_open())
{
while(file.good())
{
getline(file,line);
}
}
file.close();
Run Code Online (Sandbox Code Playgroud)
但我有记忆中的档案.我在内存中有一个地址和这个文件的大小.
我必须做些什么才能获得与上述代码中处理文件相同的流畅度?
我必须处理非常大的文本文件(2 GB),必须逐行读/写它们.使用ofstream编写2300万行非常慢,所以在开始时,我试图加快在内存缓冲区(例如256 MB或512 MB)中写入大块行的过程,然后将缓冲区写入文件.这不起作用,性能或多或少相同.我在阅读文件时遇到同样的问题.我知道I/O操作是由STL I/O系统缓冲的,这也取决于磁盘调度程序策略(由操作系统管理,在我的情况下是Linux).
有关如何提高性能的任何想法?
PS:我一直在考虑使用后台子进程(或线程)来读取/写入数据块,而程序正在处理数据,但我不知道(主要是在子进程的情况下)这是否值得.
作为一个刚接触C++并来自python背景的人,我试图将下面的代码翻译成C++
f = open('transit_test.py')
s = f.read()
Run Code Online (Sandbox Code Playgroud)
做这样的事最短的C++成语是什么?