【问题标题】:C++ flush() not working? Can't use endlC++ 刷新()不工作?无法使用endl
【发布时间】:2016-07-05 20:13:58
【问题描述】:

对于类分配,我必须重载插入和提取运算符。我无法将其打印到控制台。

已编辑

对不起,这是我第一次发帖。我意识到我没有为你们发布足够的信息,我已经更新了应该是必要的代码

driver.cpp

#include "mystring.h"
#include <iostream>

using namespace std;

int main(){
    char c[6] = {'H', 'E', 'L', 'L', 'O'}
    MyString m(c);
    cout << m;

    return 0;
}

mystring.h

class MyString
{
  friend ostream& operator<<(ostream&, const MyString&);

  public:
    MyString(const char*);
    ~MyString(const MyString&)

  private:
    char * str;  //pointer to dynamic array of characters
    int length;  //Size of the string

  };

mystring.cpp

#include "mystring.h"
#include <iostream>
#include <cstring>

using namespace std;

MyString::MyString(const char* passedIn){
    length = strlen(passedIn)-1;
    str = new char[length+1];
    strcpy(str, passedIn);
}

MyString::~MyString(){
  if(str != NULL){
    delete [] str;
  }
}

ostream& operator << (ostream& o, const MyString& m){
  for(int i = 0; i < strlen(m.str); i++){
    o << m.str[i];
  }
  o.flush();
  return o;
}

【问题讨论】:

  • 我建议要么发布相关的MyString 代码,要么创建一个不需要MyStringminimal reproducible example
  • 感觉是因为你缺少空字符
  • 此外,如果 m.str 是 C 风格的字符串,则此代码将删除其最后一个字符。显示的代码存在多个问题。
  • 我已经更新了我的帖子,以包含更多相关/有用的信息,并希望制作一个最小、完整和可验证的示例。
  • strlen(passedIn) 这是未定义的行为,因为它不是以空值终止的。

标签: c++ operator-overloading flush


【解决方案1】:

使用ostream::flush() 方法。如:

ostream& operator << (ostream& o, const MyString& m){
    for(int i = 0; i < strlen(m.str)-1; i++){
        o << m.str[i];
    }
    o.flush();
    return o;
}

【讨论】:

  • 向未来的读者添加您的答案将是有益的,这与使用操纵器 std::flush 有何不同,就像 OP 正在做的那样。如果没有这样的区别,也许这不是问题。
  • 我也尝试过使用 flush 作为成员函数,结果相同。我更新了我的帖子以尝试包含更多有用的信息。
【解决方案2】:

不要尝试从插入器内部冲洗。标准插入器都没有这样做。只需在调用main 中的插入器后添加std::cout &lt;&lt; '\n';

这里的问题是std::cout 是行缓冲的。这意味着它将插入的字符保存在内部缓冲区中,直到它看到换行符(或直到它被显式刷新)。如果您插入 std::string 对象但不结束行,您将看到相同的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多