注册 登录
编程论坛 C++教室

istream对象的使用问题

花脸 发布于 2019-01-02 22:17, 3917 次点击
#include <iostream>
using namespace std;

void f(istream i);//声明为函数的形参就不会报错
int main()
{
    //istream s;//说basic_istream类中的char_traits是保护类型的
    return 0;
}

18 回复
#2
rjsp2019-01-03 08:45
一个是类型声明,一个是变量定义。
但 void f(istream i) 你同样用不起来。
#3
Jonny02012019-01-03 10:06
就从最近的提问来说, 给你一个建议
不要死钻牛角尖, 建议跟着 C++ Primer 学习, 因为你已经有一定的基础了
不知道哪些材料会让你困惑这些问题
只有本站会员才能查看附件,请 登录
#4
花脸2019-01-03 10:35
回复 2楼 rjsp
为什么不能用?
#5
花脸2019-01-03 10:38
回复 3楼 Jonny0201
只有本站会员才能查看附件,请 登录

看剑指offer里面的一个题。想在类中定义一个ostream 类型的变量,把二叉树中的序列读到该流中,然后再从该流中把数据读出来。
#6
rjsp2019-01-03 11:01
回复 5楼 花脸
别人参数是 引用传递
你的参数是 值拷贝
#7
花脸2019-01-03 12:10
回复 6楼 rjsp
我能否在类中建立一个ostream o,把字符出入到o中,然后再从o中读取字符
#8
rjsp2019-01-03 12:18
以下是引用花脸在2019-1-3 12:10:42的发言:

我能否在类中建立一个ostream o,把字符出入到o中,然后再从o中读取字符
听不懂你说什么

是这个意思吗?
程序代码:
#include <iostream>
using namespace std;

void f( std::ostream& os )
{
    os << "123";
}

int main( void )
{
    f( cout );
}

#9
花脸2019-01-03 19:44
回复 8楼 rjsp
class A
{
    public:
        ostream o;
        void f()
        {
            int a[5];
            for(int i=0;i<5;++i)
                o<<a[i];
        }
        void f1()
        {
            //再从输出流o中读数据
        }
};

这样。
#10
Jonny02012019-01-03 22:44
程序代码:
#include <iostream>

using namespace std;
class Foo {
    private:
        ostream &os;
    public:
        Foo(ostream &os) : os {os} {}
        template <size_t N>
        void func(int (&arr)[N]) {
            for(auto c : arr) {
                this->os << c;
            }
        }
};
int main(int argc, char *argv[]) {
    Foo f(cout);
    int arr[] {1, 2, 3, 4, 5};
    f.func(arr);
}

是这样吗?
#11
花脸2019-01-03 23:14
回复 10楼 Jonny0201
不把os绑定到输出流上,只把array中的数组输入到os中,然后在另外写个函数os中读取数据。
还有一个小问题,
Foo(ostream &os) : os {os} {}
中的os{os}和os(os)的区别是什么呢?
#12
rjsp2019-01-04 08:20
以下是引用花脸在2019-1-3 23:14:53的发言:

不把os绑定到输出流上
那你总得有个存在的流吧(ostream是个抽象类),不管是cout/clog/cerr等屏幕流,还是ofstream文件流,还是ostringstream字符串流

程序代码:
#include <iostream>
#include <sstream>
using namespace std;

int main( void )
{
    std::ostringstream os;
    os << 123 << "abc";

    cout << os.str() << endl;
}

#13
花脸2019-01-04 10:46
回复 12楼 rjsp
#include <iostream>
#include <sstream>
using namespace std;

int main()
{
   
    istringstream is;
    string s("123");
    is>>s;
   
    ostringstream os;
    os<<is;
    cout<<os.str()<<endl;
    return 0;
}

我把s输入到输入流is中,然后再从is中提取输入到输出流中,为什么结果输出0,而不是123.
#14
Jonny02012019-01-04 12:09
回复 13楼 花脸
换个编译器吧
你这个根本就不可能过编译
#15
花脸2019-01-04 12:47
回复 14楼 Jonny0201
好吧。
#16
rjsp2019-01-04 14:27
回复 13楼 花脸
看不懂你的代码呀

    istringstream is;
    string s("123");
    is>>s;
既然 s 是想从 is 中获得值,那么一开始初始化为"123"有什么用?而且 is 是个空输入流,is>>s 必然什么都获得不了。
我猜你想要的是
程序代码:
#include <iostream>
#include <sstream>
using namespace std;

int main( void )
{
    istringstream is( "123" );
    string s;
    is >> s;
    cout << s << endl;
}
输出 123

ostringstream os;
os << is;
中 os << is; 又是想干什么,ios_base 重载了 operator void *() const,你在is状态fail时想返回0,非fail时返回其地址?
不知道你想什么,随便给个ostringstream的示例
程序代码:
#include <iostream>
#include <sstream>
using namespace std;

int main( void )
{
    ostringstream os;
    os << "123";
    cout << os.str() << endl;
}

#17
花脸2019-01-04 15:32
回复 16楼 rjsp
#include <iostream>
#include <sstream>
using namespace std;

int main()
{
    ostringstream os;
    string s("123");
    os<<s;
      cout<<os.str()<<endl;
      
      ostringstream _os;
      _os<<os.str();
      cout<<_os.str()<<endl;//这样,想让_os从os中提取数据
      
      
    return 0;
}
#18
cstdio2019-01-07 18:27
回复 7楼 花脸
ostream 是输出流,不能用来输入数据
#19
花脸2019-01-07 20:18
回复 18楼 cstdio
1