class string
{
public:
friend istream& operator >> ( istream& is, string& str);
private:
char *m_data;
};
int main()
{
string str;
freopen("in.txt","r",stdin);
while( cin >> str)
{
cout < < str < < endl;
}
return 0;
}
in.txt的内容是:
asdfsfgfdgdfg
在重载函数中,我使用is.get()
逐个读取这些字符,但程序在cin完成时跳出圆圈,这意味着cout将无法运行。另一方面,我尝试使用getchar()
,但它无法跳出圆圈。
问题:我对这个功能的看法有什么不对吗?或者还有另一种更好的方式来实现。 thx:)
=============================================== ========================================== 新编辑: 我的代码: @Artem Barger 代码细节
#include <iostream>
namespace Str
{
class string
{
public:
string():k(0){}
friend bool operator >> ( std::istream& is, string& str)
{
int size = 100;
char m;
if( (m = getchar()) && m == -1)
return false;
str.m_data = new char[size];
do
{
if( str.k == size)
{
size *= 2;
char *temp = new char[size];
for( int j = 0; j < str.k; ++j)
{
char *del = str.m_data;
temp[j] = *str.m_data++;
delete del;
}
str.m_data = temp;
temp = NULL;
}
str.m_data[str.k++] = m;
}while( (m = getchar()) && m != -1);
return true;
}
friend void operator << ( std::ostream& os, string& str)
{
os << str.m_data;
str.k = 0;
delete []str.m_data;
}
private:
char *m_data;
int k;
};
}
using namespace Str;
int main()
{
string str;
while( std::cin >> str)
{
std::cout << str;
}
return 0;
}
的内容仍有问题
do
{
}while();
答案 0 :(得分:1)
也许您可以像这样重写代码,这可以解决您的问题:
bool success = true;
while (sucess) {
success = cin >> str;
cout << str;
}
但是,我不明白为什么你仍然希望cout
继续 - 如果cin
调用没有成功,你只会打印字符串的旧内容 - 你不要在任何地方清除它(除非你在其他代码中这样做,你没有在这里发布)。