我想从文件中读取一块数据到字符串流中,稍后将用于解析数据(使用getline、>>等(。读取字节后,我设置了字符串流的缓冲区,但我无法设置p指针。我在一些在线服务上测试了代码,比如onlinegdb.com和cppreference.com,它是有效的。然而,在微软上,我遇到了一个错误——指针出了问题。
这是代码,我用char数组替换了读取的文件。
#include <sstream>
#include <iostream>
int main()
{
char* a = new char [30];
for (int i=0;i<30;i++)
a[i]='-';
std::stringstream os;
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
os.rdbuf()->pubsetbuf(a,30);
os.seekp(7);
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
}
工作时我得到的输出
g 0 p 0
g 0 p 7
我在视觉工作室2015 上得到的输出
g 0 p 0
g -1 p -1
有ides吗?
感谢
std::sstream::setbuf
可能什么都不做:
如果s是空指针,n为零,则此函数无效。
否则,效果是由实现定义的:有些实现什么都不做,而有些实现清除当前用作缓冲区的std::string成员,并开始使用用户提供的大小为n的字符数组作为缓冲区和输入/输出字符序列,该数组的第一个元素由s指向。
最好使用std::stringstream
构造函数来设置数据或调用str()
:
#include <sstream>
#include <iostream>
int main()
{
std::string str( 30, '-' );
std::stringstream os;
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
os.str( str );
os.seekp(7);
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
}