[Duvida] QFile read constante



  • Bom dia,
    comecei a programar a pouco tem Qt e agora deparo-me com uma duvida que gostaria de saber se alguem mais experiente sabe como resolver.

    Basicamente estou a fazer leitura da ultima linha de um ficheiro TXT para uma caixa de texto, ao pressionar um botao. O problema e que eu quero que o programa nao pare de actualizar novas entradas na ultima linha do ficheiro de texto entao o ficheiro nao for fechado.

    Por exemplo, sendo este o meu ficheiro texto a quando da primeira leitura:
    @Hello World.txt

    0
    1
    2
    3
    4
    @

    O programa devera imprimir 4 na caixa de texto.
    Mas se eu adicionar uma nova linha com o numero 5 no ficheiro texto, o programa deve actualizar automaticamente indicando que a ultima linha passou a ser 5.

    Eu fiz o mesmo programa em C++ mas agora nao estou a conseguir transpor o mesmo para Qt
    @
    while (1)
    {
    if (logfile.is_open())
    {
    logfile.seekg(0, logfile.end);
    string line;

    while (true)
    {
    while (getline(logfile, line))
    {
    strncpy_s(send_data, line.c_str(), sizeof(send_data));
    send_data[sizeof(send_data)-1] = 0;
    ...
    }
    }
    }
    @

    Neste momento em Qt tenho algo assim

    @
    void PC::on_pushButtonStream_clicked()
    {
    QFile file(filename);

    if(!file.open(QIODevice::ReadOnly))
        QMessageBox::information(0,"info",file.errorString());
    
    if(file.isOpen()){
    

    // while(true) //<------CRASH!!!
    // {
    while (!file.atEnd()) {
    QByteArray line = file.readLine();
    ui->textBrowserLog->setText(line);
    }
    // }
    }
    }
    @

    Neste momento para a caixa de texto actualizar tenho de clicar sempre no butao.

    Ja experimentei fazer um
    @while(file.isOpen())@
    mas o programa "crasha".

    Obrigado pela atencao.



  • Olá,

    Acredito que você esteja tentando implementar algo parecido com o 'tail -f'.

    Você tem que re-abrir o arquivo a cada atualização de leitura que queira fazer.

    A cada leitura terá que guardar o tamanho do arquivo. Então você vai ler na próxima vez apenas a parte acrescentada no arquivo.

    @while (true)
    {
    QFile file(filename);
    if(!file.open(QIODevice::ReadOnly))
    {
    qint64 fileSize = file.size();
    qDebug() << fileSize;
    file.seek(fileSize - num);
    qDebug() << file.read(num);
    ...
    }
    }@



  • Olá,

    Seguindo sua linha de raciocínio, você pode ficar verficando o retorno da função "readLine", quando ela retornar um QByteArray com caracteres, é sinal de que foi inserido novo caracter.

    @ void PC::on_pushButtonStream_clicked()
    {
    QFile file(filename);

        if(!file.open(QIODevice::ReadOnly))
            QMessageBox::information(0,"info",file.errorString());
     
        if(file.isOpen()){
            QByteArray line = file.readLine();
            while(line.count() > 0)
            {
                ui->textBrowserLog->setText(line);
                QByteArray line = file.readLine();                
            }
        }
    }
    

    @

    No entanto, esta não é a forma correta de se implementar isso. Você pode criar uma classe para manipular somente este arquivo e colocar ela rodar em uma thread separada para que não consuma processamento do Main, e também não deixe a tela travada. Quando o arquivo receber novas linhas você pode notificar a tela por meio de Signals e Slots. Há bastante documentação sobre isso. Caso escolha fazer desta forma, pesquise da seguinte forma:

    Espero ter ajudado.



  • Obrigado pela ajuda, neste momento fiz através do QFileSystemWatcher para verificar se ha actualizações no ficheiro de texto, quando ha acciona um trigger para actualizar a caixa de texto.

    Mas entretanto vou experimentar as vossas ideias ideias porque podem facilitar em algum processo futuro.


Log in to reply