C ++为什么我的代码不打印对给定文件的更新

时间:2015-05-01 06:40:09

标签: c++ macos clang clang++ llvm-clang

我试图在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中的错误吗?

4 个答案:

答案 0 :(得分:2)

由于缓冲区大小未达到溢出限制,因此cout缓冲区很可能未在您的测试中刷新。 您可以尝试通过执行std::cout << line << std::endl;而不是std::cout << line << "\n";或在std::cout.flush()l之前调用sleep(1);来刷新缓冲区。两种方式都应该与clang和gcc可靠地协同工作。

这些问题的答案很好地解释了缓冲:

C++ cout and cin buffers, and buffers in general

Strange behaviour of std::cout in Linux

答案 1 :(得分:1)

我已尝试使用您的代码并且工作正常。

使用以下命令编译代码:

g++ main.cpp -o testmain

我打开了两个终端: 在一个终端上首先创建temp.txt&amp;运行应用程序testmain。 从另一个运行echo命令,它会正常工作。

run application

enter image description here

你想要达到这个目的,或者你试过别的东西......

答案 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。