[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
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.