如何将一个大文件复制给string类的一个对象!!!

logic2000 2005-12-27 08:56:03
我想将一个文件(大于50兆)赋值到一个string s!!!如何做?

#include <fstream>
#include <string>
main()
{
string s;

string st;

fstream file("test.dat");


while(getline(file,st))
{
s+=st;

}
int i=0;
while(i<s.length())
{
i++;
}





}


这样做可以吗?

有哪些问题?

如何解决?

急需答案,来者给分!!!
...全文
217 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
pripor 2005-12-28
  • 打赏
  • 举报
回复
你这么个写法,得读多少年啊
建一个缓存,需要时从缓存读取
whyglinux 2005-12-27
  • 打赏
  • 举报
回复
怎样用c++的流实现把一个文件的内容一次读到一个string中?
http://community.csdn.net/Expert/TopicView3.asp?id=4383828
iamcaicainiao 2005-12-27
  • 打赏
  • 举报
回复
学习喽
vollin 2005-12-27
  • 打赏
  • 举报
回复
我就知道一个非标准容器
rope可以做这个,但直接在string中要要装这么大,也不会有什么问题吧
csucdl 2005-12-27
  • 打赏
  • 举报
回复
不知能不能, 但是好像没有这个必要
sinall 2005-12-27
  • 打赏
  • 举报
回复
《Effective STL》
条款29:需要一个一个字符输入时考虑使用istreambuf_iterator
假设我们要把一个文本文件拷贝到一个字符串对象中。似乎可以用一种很有道理的方法完成:

ifstream inputFile("interestingData.txt");
string fileData((istream_iterator<char>(inputFile)), // 把inputFile读入
istream_iterator<char>()); // fileData;关于为什么
// 它不是很正确请看下文
// 关于这个语法的警告
// 参见条款6

很快你就会发现这种方法无法把文件中的空格拷贝到字符串中。那是因为istream_iterators使用operator>>函数来进行真的读取,而且operator>>函数在默认情况下忽略空格。

假如你想保留空格,你要的做就是覆盖默认情况。只要清除输入流的skipws标志就行了:

ifstream inputFile("interestingData.txt");
inputFile.unset(ios::skipws); // 关闭inputFile的
// 忽略空格标志
string fileData((istream_iterator<char>(inputFile)), istream_iterator<char>());

现在inputFile中的所有字符都拷贝到fileData中了。

唉,你会发现它们的拷贝速度不像你想象的那么快。istream_iterators所依靠的operator>>函数进行的是格式化输入,这意味着每次你调用的时候它们都必须做大量工作。它们必须建立和销毁岗哨(sentry)对象(为每个operator>>调用进行建立和清除活动的特殊的iostream对象),它们必须检查可能影响它们行为的流标志(比如skipws),它们必须进行全面的读取错误检查,而且如果它们遇到问题,它们必须检查流的异常掩码来决定是否该抛出一个异常。如果进行格式化输入,那些都是重要的活动,但如果你需要的只是从输入流中抓取下一个字符,那就过度了。

一个更高效的方法是使用STL最好的秘密武器之一:istreambuf_iterators。你可以像istream_iterator一样使用istreambuf_iterator,但istream_iterator<char>对象使用operator>>来从输入流中读取单个字符。istreambuf_iterator<char>对象进入流的缓冲区并直接读取下一个字符。(更明确地说,一个istreambuf_iterator<char> 对象从一个istream s中读取会调用s.rdbuf()->sgetc()来读s的下一个字符。)把我们的文件读取代码改为使用istreambuf_iterator相当简单,大多数Visual Basic程序员都可以在两次尝试内做对:

ifstream inputFile("interestingData.txt");
string fileData((istreambuf_iterator<char>(inputFile)),
istreambuf_iterator<char>());

注意这里不需要“unset”skipws标志,istreambuf_iterator不忽略任何字符。它们只抓取流缓冲区的下一个字符。

相对于istream_iterator,它们抓取得更快——在我进行的简单测试中能快40%,如果你的结果不同也不用惊奇。如果随时间流逝,速度优势不断增加也不必奇怪,因为istreambuf_iterator存在于STL的一个不常访问的角落,所以实现还没有花很多时间来优化。比如,在我用过的一个实现中,istreambuf_iterator在我的主要测试中只比istream_iterator快了大约5%。那样的实现显然还有很多余地来优化它们的istreambuf_iterator实现。如果你需要一个一个地读取流中的字符,你不需要格式化输入的威力,你关心的是它们花多少时间来读取流,和明显的性能提高相比,为每个迭代器多键入三个字符的代价是微弱的。对于无格式的一个一个字符输入,你总是应该考虑使用istreambuf_iterator。

当你了解它之后,你也应该考虑把ostreambuf_iterator用于相应的无格式一个一个字符输出的作。它们没有了ostream_iterator的开销(和灵活性),所以它们通常也做得更好。
logic2000 2005-12-27
  • 打赏
  • 举报
回复
大家踊跃发言!!!

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧