13

大きくなっているファイル(何が起こっているのかと似ています)から読み込もうとしていますtail -Fが、コードに問題があるはずです。

string   log, logFile("test.log");
size_t   p = 0;

while(true)
{
    ifstream ifs(logFile.c_str());

    ifs.seekg(p);  //*1

    while(ifs.eof() == false)
    {
        getline(ifs, log);

        cout << log << endl;

        p = ifs.tellg();  //*2
    }

    nanosleep(&pause, NULL);
}

//*1行と//*2行がないと、ログファイルは最後まで正しく読み取られますが、新しい行が追加されても何も起こりません。

seekgとtellgを使用して、ファイルの現在の終了位置を保存しようとしています。これにより、ファイルを再度開いたときに、そこに移動して、追加された内容を読み取ることができます。

コードの何が問題になっているのか、そしてこの目的のために同じファイルを閉じて再度開く必要があるかどうかを知りたいのですが。

ありがとうございました。

4

4 に答える 4

17

eof()whenがtellg()返されたときにループが正しくないため、必要な呼び出しの直後に-1チェックが行われません。ループを次のように変更します。eof()getline()

while (getline(ifs, log))
{
    cout << log << endl;
    p = ifs.tellg();
}

さらに、 asは when の値が に設定されていたときの戻り値pとして宣言されています。これは、がファイルの終わりを超えて設定されていたことを意味します。のタイプを変更して、への呼び出しが成功したことを確認します。size_ttellg()-1p4294967295seekg()pstd::streamoffseekg()

if (ifs.seekg(p))
{
    while (getline(ifs, log))
    {
        cout << log << endl;
        p = ifs.tellg();
    }
}

この目的のために同じファイルを閉じて再度開く必要がある場合。

いいえ、必要ありませんが、ストリームから状態にclear()する必要があります。eof以下は、投稿されたコードの修正版に代わるものです。

#include <iostream>
#include <string>
#include <fstream>

int main()
{
    std::ifstream ifs("test.log");

    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();

            // You may want a sleep in here to avoid
            // being a CPU hog.
        }
    }

    return 0;
}
于 2012-08-01T10:36:44.530 に答える
3

これらの答えはどれもうまくいかなかったので、うまくいくものを思いつきました...

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
    string   log, logFile("test.txt");
    std::streamoff   p = 0;
    ifstream ifs(logFile.c_str());

    while(true)
    {

        ifs.seekg(p);  //*1
        while (getline(ifs, log))
        {
            cout << log << endl;
            if(ifs.tellg() == -1) p = p + log.size();
            else p = ifs.tellg();
        }
        ifs.clear();

    }
}
于 2021-02-07T05:27:32.637 に答える
0

このコードは私のために働きます:

struct timespec pause;
pause.tv_sec  = 1;
pause.tv_nsec = 0;

std::ifstream ifs("test.log");
std::streamoff p;

if(ifs.is_open())
{
    std::string line;

    while(true)
    {
        if(ifs.seekg(p))
        {
            while(std::getline(ifs, line))
            {
                std::cout << line << std::endl;
                p = ifs.tellg();
            }
        }

        ifs.clear();

        nanosleep(&pause, NULL);
    }
}
于 2015-11-03T14:42:30.943 に答える