cin>>string是怎么取得输入流长度的呢?

ccnyou 2012-04-27 06:10:40
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?
...全文
470 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
大尾巴猫 2012-05-05
  • 打赏
  • 举报
回复

std::istream & operator>>(std::istream &is, string &s)
{
char* temp = new char[string::CINLEN];
is >> temp;
if (is)
s = temp;
delete[] temp;
return is;
}

这里的CINLEN是你在string类中定义的。
大尾巴猫 2012-05-05
  • 打赏
  • 举报
回复
自己设定一个变量或者常量
就像你用cin.get(str, N)
后面这个N是你给定的,而不是缓冲区长度
然后把str复制给string对象就行了。
ccnyou 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

string类自动管理长度。
楼主的想法真是舍近求远。
[/Quote]

只是为了学习,用的话当然用string,现在是探讨其中的实现
我爱吃火锅 2012-05-02
  • 打赏
  • 举报
回复
似乎我也不懂
mars_man 2012-04-29
  • 打赏
  • 举报
回复
重新发明轮子? 何不参考参考库里自带的方法呢
ccnyou 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:
引用 7 楼 的回复:
引用 6 楼 的回复:
引用 5 楼 的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道到达末尾了。


我……
[/Quote]

嗯,的确要改为非const,这里加个判断是否遇到流结束应该可以吧?
ljhhh0123 2012-04-28
  • 打赏
  • 举报
回复
string类自动管理长度。
楼主的想法真是舍近求远。
evencoming 2012-04-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
引用 9 楼 的回复:

引用 8 楼 的回复:
引用 7 楼 的回复:
引用 6 楼 的回复:
引用 5 楼 的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道……
[/Quote]
可以
evencoming 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
引用 6 楼 的回复:
引用 5 楼 的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道到达末尾了。


我是使用char *pStr存数……
[/Quote]
貌似没达到目标吧??
没法判断流结束(如果是^z为结束的),没法读入OBJ.

另:
OBJ 改为非const的引用.
ccnyou 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 6 楼 的回复:
引用 5 楼 的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道到达末尾了。


我是使用char *pStr存数据,动态内存分配。
我重……
[/Quote]


friend istream & operator>>(istream &is,const OBJ &o)
{
char c = 0,buf[100];
int i = 0;
for(i = 0;i<100;i++)
{
is.read(&c,1);
if(c == '\r' || c == '\n')
{
break;
}

buf[i] = c;
}
return is;
}


这段代码,貌似可以达到目标,如果实现一个stack会方便点
evencoming 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道到达末尾了。


我是使用char *pStr存数据,动态内存分配。
我重载>>时是想cin>>pS……
[/Quote]
c里面的getchar有 EOF(-1).
istream& operator>>(istream &i,string& s)
{
char ch;
while(i>>ch)
{
s.push_back(ch);
}
s.clear();
return i;
}
大概这样,或许细节有问题,你看相关文档吧
ccnyou 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:
引用 3 楼 的回复:
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道到达末尾了。


我是使用char *pStr存数据,动态内存分配。
我重载>>时是想cin>>pStr;

但是我不知道……
[/Quote]

这个比较靠谱了,就是每次只读一个字节,但是怎么知道读完了呢?
evencoming 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道到达末尾了。


我是使用char *pStr存数据,动态内存分配。
我重载>>时是想cin>>pStr;

但是我不知道cin里面键盘缓冲区数据长……
[/Quote]
你应该写好 string::push_back(char );
可以一直push_back的.
而与长度无关
ccnyou 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用楼主 的回复:
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?

cin遇到流缓冲中的eof就知道到达末尾了。
[/Quote]

我是使用char *pStr存数据,动态内存分配。
我重载>>时是想cin>>pStr;

但是我不知道cin里面键盘缓冲区数据长度,假设用户输入1000字节,我只分配100,那么就崩溃了。
但是在调用cin>>pStr前用户根本还没输入,就算可以seekg把文件指针移到输入流末尾也还没有数据
飞天御剑流 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
在做一个string的类,想重载>>,由于内存需要自己管理,在cin>>string时我想必须先取得输入流长度才能知道应该分配多少内存吧?应该怎么做呢?
[/Quote]
cin遇到流缓冲中的eof就知道到达末尾了。
cdsnfresh 2012-04-27
  • 打赏
  • 举报
回复
string.size()???
evencoming 2012-04-27
  • 打赏
  • 举报
回复
是先分配一段内存,然后push_back..
当不够了,再new copy,delete old
一直循环...

64,282

社区成员

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

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