为什么std :: ifstream如果全局定义则不更新

时间:2014-12-03 09:07:11

标签: c++ ifstream

我试图用C ++编写一个简单的尾部程序。我已经尝试了example from this solution,它就像一个魅力。

然后,我尝试将ifstream视为全局。现在,代码不再起作用,如果我编辑文件,则不会显示任何内容。

为什么会这样?我阅读ifstream::open的{​​{3}}并且我没有看到任何类型的错误,但代码不起作用:

  

打开由参数filename标识的文件,并将其关联   流对象,以便执行输入/输出操作   它的内容。参数模式指定打开模式。

以下是非工作代码:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int find_last_linefeed(ifstream &infile) {
  infile.seekg(0,ios::end);
  int filesize = infile.tellg();
  for(int n=1;n<filesize;n++) {
    infile.seekg(filesize-n-1,ios::beg);
    char c;
    infile.get(c);
    if(c == 0x0A) return infile.tellg();
  }
}

ifstream infile;

int main() {
  int last_position=-1;
  for(;;) {
    infile.open("/Users/alberto/tmp/test");

    int position = find_last_linefeed(infile);
    if(position > last_position) {
      infile.seekg(position,ios::beg);
      string in;
      infile >> in;
      cout << in << endl;
    }
    last_position=position;
    sleep(1);
  }
}

以下是工作代码:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int find_last_linefeed(ifstream &infile) {
  infile.seekg(0,ios::end);
  int filesize = infile.tellg();
  for(int n=1;n<filesize;n++) {
    infile.seekg(filesize-n-1,ios::beg);
    char c;
    infile.get(c);
    if(c == 0x0A) return infile.tellg();
  }
}


int main() {
  int last_position=-1;
  for(;;) {

    ifstream infile;

    infile.open("/Users/alberto/tmp/test");

    int position = find_last_linefeed(infile);
    if(position > last_position) {
      infile.seekg(position,ios::beg);
      string in;
      infile >> in;
      cout << in << endl;
    }
    last_position=position;
    sleep(1);
  }
}

1 个答案:

答案 0 :(得分:2)

由于你在循环中open,流将在第二次迭代时进入错误状态,并在此之后继续失败。

移动

infile.open("/Users/alberto/tmp/test");

在循环之外,或者像这样定义infile并且根本不使用open

ifstream infile("/Users/alberto/tmp/test");

最好的选择是根本不使用全局变量,因为这里没有理由。

此外,如果文件不包含未定义的换行符,find_last_linefeed将无法返回任何内容。

-

关于ifstream::open,来自标准(27.9.1.9):

  

调用rdbuf() - &gt; open(s,mode | ios_base :: in)。如果该功能没有   返回空指针调用clear(),否则调用setstate(failbit)

basic_filebuf::open(27.9.1.4):

  

如果is_open()!= false,则返回空指针