有没有办法知道在C ++中打印到标准输出的大小?

时间:2017-07-07 22:51:01

标签: c++

例如,如果我使用以下内容:

cout << "hello world";

有没有办法知道正在打印到stdout的大小?

3 个答案:

答案 0 :(得分:7)

您可以使用std::stringstream

#include <sstream>
#include <iostream>

int main(){
  std::stringstream ss;
  int a = 3;
  ss<<"Hello, world! "<<a<<std::endl;
  std::cout<<"Size was: "<<ss.str().size()<<std::endl;
  std::cout<<ss.str()<<std::endl;
}

以上为&#34; Hello,world!&#34;返回16:14字符,变量a的内容为1个字符,std::endl为1个字符。

答案 1 :(得分:1)

我怀疑有一种标准方法可以确定在写入之前将多少字节写入标准输出。

您可以做的是,将其写入ostringstream并获取流的大小。这使工作加倍,但为您提供了一种标准的通用方法来确定对象在写入流时将占用的字节数:

template <class T>
std::size_t stream_len(const T& t)
{
    std::ostringstream oss;
    oss << t;
    return oss.tellp();
}

以下是演示:http://coliru.stacked-crooked.com/a/3de664b4059250ae

答案 2 :(得分:0)

这是一种旧式C风格的方式,它仍然是有效的C ++以及现代C ++:

#include <iostream>

int main() {
    // C style but still valid c++
    std::cout << "C style but still valid C++\n";
    char phrase[] = { 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' }; 
    char phrase2[] = { "hello world" };

    // Adding 1 for the new line character.
    std::cout << "size of phrase[] in bytes = " 
              << sizeof(phrase) 
              << " + 1 for newline giving total of " 
              << sizeof(phrase) + 1 
              << " total bytes\n"; // Not Null terminated

    std::cout << "size of phrase2[] in bytes = " 
              << sizeof(phrase2) 
              << " + 1 for newline giving total of " 
              << sizeof(phrase2) + 1 
              << " total bytes\n";  // Null terminated

    // Or you can do it more c++ style
    std::cout << "\nC++ style\n";
    // Also adding one for newline character and this string is not null terminated
    std::cout << "size of string in bytes = " 
              << std::string("hello world").size() 
              << " + 1 for newline giving a total of " 
              << std::string("hello world").size() + 1 
              << " total bytes\n";

    std::cout << "Press any key and enter to quit." << std::endl;
    char c;
    std::cin >> c;

    return 0;
}

因为C / C ++中的每个字符都是1个字节;你需要的只是字符数,包括空格,空终止符,换行符等特殊字符。这就是为什么C / C ++中有sizeof( Type ) operator

<强>输出

C style but still valid C++
size of phrase[] in bytes = 11 + 1 for newline giving total of 12 total bytes
size of phrase2[] in bytes = 12 + 1 for newline giving total of 13 total bytes

C++ style
size of string in bytes = 11 + 1 for newline giving a total of 12 total bytes
Press any key and enter to quit.

现在,只有在将输出发送到ostream's cout对象之前,才会显示输出的大小。这也没有反映出描述此输出的文本的添加字符。

正如其他人所说,您可以使用stringstream将一堆字符串,字符和其他数据类型连接到stringstream insertion operator <<对象中,然后使用stream's } member function为您提供bytes中的大小。

它的工作方式与std::string( ... ).size()相同。