【问题标题】:C++ converting file stream function to use a stringstreamC++ 转换文件流函数以使用字符串流
【发布时间】:2011-09-20 11:09:39
【问题描述】:

我有很多从文件流中读取数据的 c++ 类。函数如下所示。

bool LoadFromFile(class ifstream &file);

我正在创建一个从内存而不是文件读取的新函数。所以我用谷歌搜索了一下,一个 istringstream 似乎可以做到这一点,而无需对代码进行任何修改。

bool LoadFromData(class istringstream &file);

现在我的问题是。我需要构造这个流以从 char 数组中读取。该字符串不是以空值结尾的,它是纯二进制数据,我得到了一个具有大小的整数。我尝试将它分配给一个字符串并从一个字符串创建一个流,但是字符串在一个空字符之后终止......并且数据被复制。

int size;
char *data;
string s = *data;

如何在不复制数据+指定指针数据大小的情况下从 char 数组指针创建字符串?除了字符串流,你还知道其他解决方案吗?

【问题讨论】:

  • 所以,澄清一下:你的问题是你的char * 不是空终止的,因此你在构建std::string 时遇到问题吗?
  • 是的,这基本上就是问题所在。我也想知道是否有人知道更好的解决方案。
  • 这可能是解决方案:stackoverflow.com/questions/2079912/…(一个版本使用 boost,用于复制数据,一个仅适用于 gcc)

标签: c++ ifstream stringstream


【解决方案1】:

编写一个自己的basic_streambuf 类! More details.。 (这样你就可以在当前内存上工作。)

从指针和大小创建字符串:string str(data,data+size);(它将复制数据)。

关于更多的事情:你应该根据istream重写你的函数:

bool LoadFromStream(istream &is);

这样你就可以做到以下几点,因为istringstreamifstream都是基于istream(以后这个函数也可以支持tcp流...):

ifstream file;
istringstream sstream;

LoadFromStream(file);
LoadFromStream(sstream);

【讨论】:

  • 非常感谢!这解决了我的问题,根本没有改变功能!
  • 似乎它适用于文件流,但是当我将字符串流传递给它时,我得到了这个编译器错误(上面的确切代码)。我尽力研究它,但我就是不明白。它是在 VS 中编译的。无法将参数 1 从 'class std::basic_istringstream,class std::allocator >' 转换为 'class istream &'
  • 我在很多地方都使用它。您应该将bool LoadFromStream(istream &is); 定义为bool LoadFromStream(class istream &is); 在头文件中我通常不使用using namespace std;,因此定义为:bool LoadFromStream(std::istream &is);。你应该包括<istream>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2015-11-18
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多