我试图用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);
}
}
答案 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,则返回空指针