读取文件直到空行

时间:2010-12-11 20:25:50

标签: c++ file-io operators

Jerry Coffin阅读question的答案之后,我将他的代码复制粘贴到我的编辑器中,经过一些小的编辑后,它编译并按照应该的方式运行。

以下是更改后的代码:

 #include <iostream>
 #include <string>
 #include <istream>
 #include <fstream>

class non_blank {
private:
 std::string data_;

 friend std::istream& operator>> (std::istream &is, non_blank &n) {
  std::getline(is, n.data_);

  if (n.data_.length() == 0) {
   is.setstate(std::ios::failbit);
  }
  return is;
 }

public:
 operator std::string() const {
  return data_;
 }
};


int main(int, char *[]) {

 non_blank line;
 std::ifstream ifs("teste.txt");

 while(ifs >> line) {
  //std::cout << line; <----- error
  std::string s = line;
  std::cout << s << std::endl;
 }

 return 0;
}
  • 尝试在std::cout <<...表达式中使用non_blank变量时出错。我不应该在任何地方使用std :: string的变量使用non_blank类型的变量吗?这不是演员/转换运算符的目的吗? answer

  • 为什么我无法直接在string::data_的定义中访问私有变量operator >>

这是我得到的错误:

..\main.cpp: In function `std::istream& operator>>(std::istream&, non_blank&)':
..\main.cpp:21: error: invalid use of non-static data member `non_blank::data_'
..\main.cpp:26: error: from this location

1 个答案:

答案 0 :(得分:1)

  

我不应该能够使用变量   我愿意在任何地方使用non_blank类型   使用std :: string?不是吗?   施法者的蠢事?

不完全。如果编译器看到你做了一些它知道需要std :: string的东西,它可以调用你的转换操作符来获取一个。但是在ostream运算符&lt;&lt;的情况下,它没有一个特定的函数可以调用,而是相当多的它们,都是不同的,没有一个与你打算打印的实际类型完全匹配。所以它列出了一大堆候选人,其中没有一个是足够强大的匹配。您需要定义一个ostream运算符&lt;&lt;对于你的类型,以使其打印应该。

对于您的运营商&gt;&gt;,您应该让它不是您班级的成员。如果必须,在类声明中将其声明为朋友,但在外部编写函数。