读取文件并将其存储在c ++中的受保护变量中

时间:2017-09-18 12:47:53

标签: c++ c++14

我试图读取文件并将其存储在受保护的变量中。所有方法都属于同一类。

class A: public B
{
  public:
     //method declarations
  protected:
  string d;
};

void A::l(std::string filename)
{
  ifstream ifs;
  ifs.open(filename);
  string d { istreambuf_iterator<char> {ifs}, istreambuf_iterator<char> {} };  
  ifs.close();
 }

 void A::f(void)
 {
   std::cout << d.length()  << std::endl;
 }

当我尝试打印字符串的长度时,它为0.当我尝试在f()中打印d时,不会打印任何内容。我需要d成为受保护的变量,我也无法更改方法。如何将读取文件字符串传递给f方法?

2 个答案:

答案 0 :(得分:1)

您已分配到本地,请使用该成员(此处@Component({ selector: 'error-desc', template: '<h1>Error page = {{code}}</h1>' changeDetection: ChangeDetectionStrategy.OnPush }) export class ErrorComponent implements OnInit { public code: string = ''; constructor( ) {} ngOnInit() { // not called this.code="AAAA"; console.log("OnInit"); } ngOnDestroy() { console.log("OnDestroy"); } } 是可选的):

this->

如果这没有帮助,您可能错误地指定了文件名。

尝试绝对路径(例如/home/user/file.txt或C:\ Documents \ User \ Documents \ file.txt)检查程序的工作目录。

您始终可以检查错误:

this->d.assign(istreambuf_iterator<char> {ifs}, {});

答案 1 :(得分:0)

您的问题与您的变量受到保护无关。问题是您要定义另一个具有相同名称的变量。为了避免这个问题,有些人在变量的名称后附加一个下划线,比如'd_',其他人写'm_d'。但如果你不想这样做,你就不需要这样做。

执行您要执行的操作的一种方法如下:

class A
{
  public:
  void l(std::string filename);
  void f();

 //method declarations
 protected:
 string d;

};

void A::l(std::string filename)
{
  ifstream ifs{filename};
  if(!ifs)
      return; // error

  std::copy(istreambuf_iterator<char>{ifs},
        istreambuf_iterator<char>{},
        std::back_inserter(d)); // this is A::d

}

您不需要使用'this-&gt;'。实际上在C ++中你永远不会使用'this'(仅限于'return * this'这样的句子)。

另外,在C ++中你不写:

void f(void);

但是,你写了

void f();

而且你也不需要关闭ifstream。析构函数会为你做这件事。