{char temp[string::len]; //2
is.get(temp,string::len); //3
if(is) //4
st=temp; //5
while(is && is.get()!='\n') //6
continue; //7
return is; //8
}
8 个解决方案
#1
你确保你定义的重载函数没错吗..?
我觉得有点问题啊?
1.第一行:
定义重载函数的接口.因为重载的是>>,所以函数名是operator >>,理所当然..
参数中一个是接收输入的对象,一个是输入的字符串..因为复合类型,所以均为引用类型,,
将返回值类型声明为引用类型有使得其返回值可以作为左值,进行连着输入..
2.
我觉得有点问题啊?
1.第一行:
定义重载函数的接口.因为重载的是>>,所以函数名是operator >>,理所当然..
参数中一个是接收输入的对象,一个是输入的字符串..因为复合类型,所以均为引用类型,,
将返回值类型声明为引用类型有使得其返回值可以作为左值,进行连着输入..
2.
#2
第二,三行,应该是 string::len()吧..
#3
第2,3行没错,不要过忘了注明len是个const常量,例子里是80,这段是我从例子里截取下来的
#4
每行只读入前面最大为string::len个字符(包括空格)到st中
#5
3 读入最大长度为string::len个字符到temp中
4,5如果读入时没有发生错误把temp值拷贝到st中
6,7跳过当前行的其他字符以及换行符,因为get的缺省分隔符‘\n’,如果不跳过它会作为istream的下一个字符
8把当前的istream返回继续使用
4,5如果读入时没有发生错误把temp值拷贝到st中
6,7跳过当前行的其他字符以及换行符,因为get的缺省分隔符‘\n’,如果不跳过它会作为istream的下一个字符
8把当前的istream返回继续使用
#6
楼上的能不能再讲详细点,特别是4,5,6,8行
#7
由于在第三行get返回的状态信息是保存在is中因此第四行判断刚才的读入是否正确。
而第6行是为了跳过该行剩余的字符和换行符(因此该程序最大每次只读入80个字符,其余的丢弃),特别是换行符。对于换行符,因为它是get缺省的分隔符,即get函数遇到它就终止本次读入无论是否目前读入的数据是否达到指定读入长度。而对于istream.get(char *sink, streamsize size, char delimiter='\n'))来说它并不会读入\n而是把它当作下次的第一个字符,因此必须用istream.get()来读取并丢弃掉\n.注意这里的两个get(..)函数是不同的哦,是重载。
因为>>运算符的返回值为istream,因此必须把当前的istream返回。这也就是为什么你在C++中可以连续使用>>的原因了。如从终端读入第一个字符串给dataA第二个给dataB:
cin >> dataA >> dataB
从整体来说这个重载>>操作符的意义就是:从istream中每次读入一行,每行最多80个字符
而第6行是为了跳过该行剩余的字符和换行符(因此该程序最大每次只读入80个字符,其余的丢弃),特别是换行符。对于换行符,因为它是get缺省的分隔符,即get函数遇到它就终止本次读入无论是否目前读入的数据是否达到指定读入长度。而对于istream.get(char *sink, streamsize size, char delimiter='\n'))来说它并不会读入\n而是把它当作下次的第一个字符,因此必须用istream.get()来读取并丢弃掉\n.注意这里的两个get(..)函数是不同的哦,是重载。
因为>>运算符的返回值为istream,因此必须把当前的istream返回。这也就是为什么你在C++中可以连续使用>>的原因了。如从终端读入第一个字符串给dataA第二个给dataB:
cin >> dataA >> dataB
从整体来说这个重载>>操作符的意义就是:从istream中每次读入一行,每行最多80个字符
#8
对于换行符,因为它是get缺省的分隔符,即get函数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意这里的get函数指第三行调用的istream.get(char *sink, streamsize size, char delimiter='\n')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意这里的get函数指第三行调用的istream.get(char *sink, streamsize size, char delimiter='\n')
#1
你确保你定义的重载函数没错吗..?
我觉得有点问题啊?
1.第一行:
定义重载函数的接口.因为重载的是>>,所以函数名是operator >>,理所当然..
参数中一个是接收输入的对象,一个是输入的字符串..因为复合类型,所以均为引用类型,,
将返回值类型声明为引用类型有使得其返回值可以作为左值,进行连着输入..
2.
我觉得有点问题啊?
1.第一行:
定义重载函数的接口.因为重载的是>>,所以函数名是operator >>,理所当然..
参数中一个是接收输入的对象,一个是输入的字符串..因为复合类型,所以均为引用类型,,
将返回值类型声明为引用类型有使得其返回值可以作为左值,进行连着输入..
2.
#2
第二,三行,应该是 string::len()吧..
#3
第2,3行没错,不要过忘了注明len是个const常量,例子里是80,这段是我从例子里截取下来的
#4
每行只读入前面最大为string::len个字符(包括空格)到st中
#5
3 读入最大长度为string::len个字符到temp中
4,5如果读入时没有发生错误把temp值拷贝到st中
6,7跳过当前行的其他字符以及换行符,因为get的缺省分隔符‘\n’,如果不跳过它会作为istream的下一个字符
8把当前的istream返回继续使用
4,5如果读入时没有发生错误把temp值拷贝到st中
6,7跳过当前行的其他字符以及换行符,因为get的缺省分隔符‘\n’,如果不跳过它会作为istream的下一个字符
8把当前的istream返回继续使用
#6
楼上的能不能再讲详细点,特别是4,5,6,8行
#7
由于在第三行get返回的状态信息是保存在is中因此第四行判断刚才的读入是否正确。
而第6行是为了跳过该行剩余的字符和换行符(因此该程序最大每次只读入80个字符,其余的丢弃),特别是换行符。对于换行符,因为它是get缺省的分隔符,即get函数遇到它就终止本次读入无论是否目前读入的数据是否达到指定读入长度。而对于istream.get(char *sink, streamsize size, char delimiter='\n'))来说它并不会读入\n而是把它当作下次的第一个字符,因此必须用istream.get()来读取并丢弃掉\n.注意这里的两个get(..)函数是不同的哦,是重载。
因为>>运算符的返回值为istream,因此必须把当前的istream返回。这也就是为什么你在C++中可以连续使用>>的原因了。如从终端读入第一个字符串给dataA第二个给dataB:
cin >> dataA >> dataB
从整体来说这个重载>>操作符的意义就是:从istream中每次读入一行,每行最多80个字符
而第6行是为了跳过该行剩余的字符和换行符(因此该程序最大每次只读入80个字符,其余的丢弃),特别是换行符。对于换行符,因为它是get缺省的分隔符,即get函数遇到它就终止本次读入无论是否目前读入的数据是否达到指定读入长度。而对于istream.get(char *sink, streamsize size, char delimiter='\n'))来说它并不会读入\n而是把它当作下次的第一个字符,因此必须用istream.get()来读取并丢弃掉\n.注意这里的两个get(..)函数是不同的哦,是重载。
因为>>运算符的返回值为istream,因此必须把当前的istream返回。这也就是为什么你在C++中可以连续使用>>的原因了。如从终端读入第一个字符串给dataA第二个给dataB:
cin >> dataA >> dataB
从整体来说这个重载>>操作符的意义就是:从istream中每次读入一行,每行最多80个字符
#8
对于换行符,因为它是get缺省的分隔符,即get函数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意这里的get函数指第三行调用的istream.get(char *sink, streamsize size, char delimiter='\n')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意这里的get函数指第三行调用的istream.get(char *sink, streamsize size, char delimiter='\n')