我试图在C ++中编写代码,在linux中执行类似tail -f
的操作。我发现了这个问题:
How to read a growing text file in C++?并实施了同样的目标。我创建了temp.txt
并开始执行echo "temp" >> temp.txt
。但是我的程序没有打印对文件所做的更新。我做错了什么?这是我正在使用的代码
#include <iostream>
#include <string>
#include <fstream>
#include <unistd.h>
int main()
{
std::ifstream ifs("temp.txt");
if (ifs.is_open())
{
std::string line;
while (true)
{
while (std::getline(ifs, line)) std::cout << line << "\n";
if (!ifs.eof()) break; // Ensure end of read was EOF.
ifs.clear();
sleep(3);
}
}
return 0;
}
更新
我在linux机器上尝试了相同的代码并且它工作正常,但它无法在Mac上运行。我正在使用gcc
来编译代码。
gcc -v
给出了
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix
更新2
我进一步调查并意识到我毕竟不使用gcc。我已经单独安装了gcc,现在工作正常。这是clang
中的错误吗?
答案 0 :(得分:2)
由于缓冲区大小未达到溢出限制,因此cout
缓冲区很可能未在您的测试中刷新。
您可以尝试通过执行std::cout << line << std::endl;
而不是std::cout << line << "\n";
或在std::cout.flush()l
之前调用sleep(1);
来刷新缓冲区。两种方式都应该与clang和gcc可靠地协同工作。
这些问题的答案很好地解释了缓冲:
答案 1 :(得分:1)
我已尝试使用您的代码并且工作正常。
使用以下命令编译代码:
g++ main.cpp -o testmain
我打开了两个终端: 在一个终端上首先创建temp.txt&amp;运行应用程序testmain。 从另一个运行echo命令,它会正常工作。
你想要达到这个目的,或者你试过别的东西......
答案 2 :(得分:1)
在ifs.sync()
之后尝试拨打sleep
。我能够用你发布的代码重现你的问题,这个改变为我解决了这个问题。
此处还有明显的重复clang 3.3/Xcode & libc++: std::getline does not read data after calling ifstream::clear()
答案 3 :(得分:0)
以下在附加到文件时有效。
#include <iostream>
#include <string>
#include <fstream>
#include <unistd.h>
int main()
{
std::ifstream ifs("temp.txt");
if (ifs.is_open())
{
std::string line;
while (true)
{
while (ifs.good()) { // while we are good
std::getline(ifs, line); // read a line
if (ifs.eof()) break; // if this is the end, break
std::cout << line << "\n";
}
ifs.clear(); // clear the error flags
sleep(1); // sleep a bit
}
}
return 0;
}
对于一般情况(例如处理文件截断等),您可以使用tellg / seekg。