iostream限制要读取的最大字符数 在Bruce Eckel的“C++思想”的帮助下学习C++。卡在“Iostreams”一章的练习05中: 练习文本

iostream限制要读取的最大字符数 在Bruce Eckel的“C++思想”的帮助下学习C++。卡在“Iostreams”一章的练习05中: 练习文本,c++,iostream,manipulators,C++,Iostream,Manipulators,我们知道setw()允许读取最少的字符,但是如果您想读取 最大限度编写一个效应器,允许用户指定要执行的最大字符数 摘录让您的效应器也为输出工作,这样输出字段就会被截断(如果需要) 必要时,保持在宽度限制内 我了解如何创建不带参数和带参数的操纵器(在本书术语中称为效应器)。但不了解如何限制要提取的最大字符数std::ios_base::width指定最小字符数 我应该对底层的streambufobject做一些技巧吗?这不是一个完美的解决方案(但如果不阅读iostream库,我现在想不出其他方法)

我们知道setw()允许读取最少的字符,但是如果您想读取 最大限度编写一个效应器,允许用户指定要执行的最大字符数 摘录让您的效应器也为输出工作,这样输出字段就会被截断(如果需要) 必要时,保持在宽度限制内

我了解如何创建不带参数和带参数的操纵器(在本书术语中称为效应器)。但不了解如何限制要提取的最大字符数
std::ios_base::width
指定最小字符数


我应该对底层的
streambuf
object做一些技巧吗?

这不是一个完美的解决方案(但如果不阅读iostream库,我现在想不出其他方法)

假设你是:

class MaxFieldSize {/*STUFF*/};
当您编写流操作符时,您会编写一个稍微有点古怪的操作符,它不会返回实际的流(而是返回一个带有包装器的流)

那么您所需要的就是通用重载:

template<typename T>
std::ostream& operator<<(MaxFieldWithStream& mfwstream, T const& value)
{
    std::stringstream  trunStream;
    trunStream << value;

    return mfwstream.printTruncatedData(trunStream.substr(0, mfwstream.widthNeeded));
}
// You will probably need another overload for io-manipulators.

这不是一个完美的解决方案(但如果不阅读iostream库,我现在想不出其他方法)

假设你是:

class MaxFieldSize {/*STUFF*/};
当您编写流操作符时,您会编写一个稍微有点古怪的操作符,它不会返回实际的流(而是返回一个带有包装器的流)

那么您所需要的就是通用重载:

template<typename T>
std::ostream& operator<<(MaxFieldWithStream& mfwstream, T const& value)
{
    std::stringstream  trunStream;
    trunStream << value;

    return mfwstream.printTruncatedData(trunStream.substr(0, mfwstream.widthNeeded));
}
// You will probably need another overload for io-manipulators.
#包括
#包括
#包括
#包括
使用名称空间std;
类fixW{
char*chrP;
char-str[1024];
最大尺寸;
公众:
fixW(char*p,size_t m=25):chrP(p),Max(m){
friend istream&operator>>(istream&is,fixW fw){
is>>fw.str;
尺寸n=strlen(fw.str);
不能包含
#包括
#包括
#包括
使用名称空间std;
类fixW{
char*chrP;
char-str[1024];
最大尺寸;
公众:
fixW(char*p,size_t m=25):chrP(p),Max(m){
friend istream&operator>>(istream&is,fixW fw){
is>>fw.str;
尺寸n=strlen(fw.str);

cout Minimum?在我看来似乎是最大值:字段宽度决定了在某些输出表示中要写入的最小字符数。遗憾的是,它没有说明如何将其用于输入。对于字符数组和std::string,是的,它工作正常。但是如果std::cin>>a,其中a是int呢?而在std::cin上,我们有“23424”,则在a中不会有第一个“最大”字符,而是所有的输入(可能会溢出)。我找到了标准所说的(C++11§27.7.2.2.3/7-8):如果width()大于零,n是width()..提取并存储字符,直到出现以下任一情况:-存储n-1个字符;-文件结尾出现在输入序列上;-ct.is(ct.space,c)对于下一个可用输入字符c为真,其中ct为use_facet>(in.getloc())。但这仅适用于
图表*
无符号字符*
、和
有符号字符*
重载。我看不到任何关于算术类型的字段宽度。最小值?在我看来似乎是最大值:字段宽度决定了某些输出表示中要写入的最小字符数。遗憾的是,它没有任何关于在输入中使用它的东西。对于字符数组和std::string是的,它工作正常。但是如果std::cin>>a,其中a是int?并且在std::cin上有“234234”,那么在a中不会有第一个“最大”字符,而是所有的输入(可能溢出)。我发现了标准所说的(C++11§27.7.2.2.3/7-8):如果宽度()大于零,n为宽度()..提取并存储字符,直到出现以下任一情况:-存储n-1个字符;-文件结尾出现在输入序列上;-ct.is(ct.space,c)对于下一个可用输入字符c为真,其中ct为use_facet>(in.getloc())。这仅适用于
图表*
无符号字符*
有符号字符*
重载。我看不到任何关于算术类型的字段宽度的提及。你能对你的代码发表评论并谈谈它如何解决问题吗?你能对你的代码发表评论并谈谈它如何解决问题吗?
class MaxFieldWithStream
{
    std::ostream& printTruncatedData(std::string& value);};
    operator st::ostream&() const { return BLABLAVLA;}
};
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
using namespace std;    
class fixW{
    char* chrP;
    char str[1024];
    size_t Max;
    public:
    fixW(char* p,size_t m=25):chrP(p),Max(m){}

    friend istream& operator >>(istream& is,fixW fw){
        is >>fw.str;
        size_t n=strlen(fw.str);
        cout <<" n= "<<n << endl;
        if(n>=25){
            fw.str[fw.Max]='\0';
        }

        strcpy(fw.chrP,fw.str);
        return is;
    }

    friend ostream& operator<<(ostream& os, fixW fw){
        for(size_t i= 0; i<fw.Max; ++i){
            fw.str[i] = fw.chrP[i];
        }

        fw.str[fw.Max]='\0';
        return os <<fw.str;
    }
};
int main(){
    char s[80];
    cin >> fixW(s,25);
    cout << s << endl;
    cout << fixW(s,10)<<endl;
    cout << s <<endl;
    return 0;
}