m
29 марта 2019 г. 20:01

Открытие и считыванание файла в автоматическом режиме

Qt

Форумчане, столкнулся с проблемой открытия файла без участия пользователя. Принимаю файл с устройства по протоколу Tcp/Ip, ставится задача перевести принимаемый файл в автоматическом режиме в формат .csv(Excel). Проблема заключается в следующем, работа функции начинается после получения сигнала о получении файла, соответственно в теле функции произвожу проверку на существование самого файла в директории if(QFile::exists(asd)), проверка производится успешно, условие открытия файла так же всегда выполняется if(myFile.open(QIODevice::ReadWrite)), но в QByteArray не проивзодится запись, он пустой, соответственно и весь последующий алгоритм не работает. При этом, если я прохожу все этапы под отладчиком, с установкой точек останова, то ArrayB заполняется так как надо, т.е. он не пустой. Связываю данную проблему с тем, что выполнение функции просходит именно в момент создания файла, т.е. моё устройство успело только создать файл, а записать в него данные не успело, и происходит в этот момент запуск моей функции MainWindow::AutoExportCSVfile() .

void MainWindow::AutoExportCSVfile()
{ 
    QStringList listExcelExport;
    QString asd1;
    QByteArray arrayB;
    QString asd = LastDirectory +"/" + NewMeasurmentDLG.getFileName() ;    //LastDirectory = D:/Data , NewMeasurmentDLG.getFileName() = myNewFile.dat
    asd1 = asd;
    asd1.chop(3);
    asd1+="csv";
    qDebug()<<"File exists?"<<QFile::exists(asd);      //Debug = true , Run = true
    if(QFile::exists(asd))
    {
        QFile myFile(asd);
        qDebug()<<myFile.bytesAvailable();          //Debug = нужное количество байт , Run = 0
        if(myFile.open(QIODevice::ReadWrite))
        {
            qDebug()<<"File can read?"<<myFile.waitForReadyRead(3000);    //Debug = false , Run = false
            qDebug()<<"Open File? "<<myFile.isOpen();                     //Debug = true , Run = true
            arrayB=myFile.readAll();
            qDebug()<<"lenght arrayB?"<<arrayB.length();                  //Debug = нужная длинна , Run = 0
            myFile.close();
            listExcelExport= arrayB.split(QRegExp("[\r \n ;]+"), QString::SkipEmptyParts);
            QFile exportFile(asd1);
            if(exportFile.open(QIODevice::WriteOnly))                    //Debug = true , Run = true
            {
                QTextStream ts(&exportFile);

                qDebug()<<"Dlinna listExcelExport = "<<listExcelExport.length();               
                for(int c= 80; c<listExcelExport.length()-1;c+=2)
                {
                    strList<<listExcelExport[c] + ";" + listExcelExport[c+1] +";";
                }
                ts<<strList.join("\n");
                exportFile.close();
            }
            QString outS= "Файл " + asd1 + " успешно сохранён!";
            textStatusBar->setText(outS);                     //Вывод в строку состояния сообщения 

        }
    }
}

Пытался решить дануую проблему путём бесконечного цикла ожидания waitForReadyRead(-1), но цикл никогда не завершается, всегда условие false (При этом файл уже полностью получен)

for (;;)
    {
        if(myFile.waitForReadyRead(-1))
        {
            break;
        }
    }

Может кто сталкивался с подобным? Файл всегда имеет разную длинну, условие проверки по количеству байт тоже не сработает.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
1

Добрый день.

Думаю, что проблема не в том куске кода, который вы привели, а в том, который вызывает экспорт файла в csv формат. Если вы принимаете данные по TCP/IP, то, если я понимаю правильно, вы пытаетесь делать экспорт файла ещё до того, как изначальный файл вообще был принят. Думаю, что это не правильно. Вам нужно либо дождаться полной записи исходного файла, а потом уже выполнить его экспорт. Либо делать корректировку файла на лету без создания исходного файла.

  • В первом случае нужно выполнять вызов метода AutoExportCSVfile() только после окончания передачи данных.
  • Во втором случае нужно модифицировать методы принимающие данные, листинга которых здесь нет.

Я бы вам предложил сначала реализовать первый вариант.

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
SZ
24 июня 2019 г. 17:49
Serg Zhi

C++ - Тест 003. Условия и циклы

  • Результат:78баллов,
  • Очки рейтинга2
АС
24 июня 2019 г. 8:03
Александр Спиридонов

C++ - Тест 001. Первая программа и типы данных

  • Результат:53баллов,
  • Очки рейтинга-4
БА
23 июня 2019 г. 13:52
Борис Артамонов

C++ - Тест 003. Условия и циклы

  • Результат:35баллов,
  • Очки рейтинга-10
Последние комментарии
24 июня 2019 г. 10:23
Евгений Легоцкой

Хорошо, ну будут проблемы помимо того, что касается статей, то не стесняйтесь задавать вопросы на форуме.
МБ
24 июня 2019 г. 10:21
Михаил Булатов

Извиняюсь, все работает(из-за невнимательности).
24 июня 2019 г. 9:52
Евгений Легоцкой

Придётся делать ещё сигнал в дочернем qml и пробрасывать через коннекты и обработчики. А вообще нужно смотреть конкретный код и что вы пытаетесь сделать. Так что лучше будет, если вы зад...
21 июня 2019 г. 8:31
Ruslan Polupan

Вот моя строка по которой все отлично сработало %cqtdeployer% -bin c:/CentralMposKeys/CentalMposKeys.exe -qmake c:/Qt/5.12.2/mingw73_64/bin/qmake.exe
21 июня 2019 г. 8:24
Андрей Янкович

Возможно кому то пригодится сqtdeployer для windows работает точно так же как и для Linux разница лишь в команде запуска Linux: cqtdeployer Windows: %cqtdeployer...
Сейчас обсуждают на форуме
24 июня 2019 г. 14:36
Михаиллл

Нашел проект подключения к вебсокету.Но по моему адресу не могу подключиться.Нужно ли для этого использовать библиотеки?Вы не знаете адрес вебсокета, на котором можно проверить с...
24 июня 2019 г. 14:07
Евгений Легоцкой

Я пока даже не знаю, а какой код самого подключения? использовали ожидание на подключение? Так делали? socket->connectToServer("market");if (socket->waitForConnected(1000)) ...
24 июня 2019 г. 13:19
IscanderChe

// widget.cpp#include "widget.h"#include <QTableView>#include <QVBoxLayout>#include "checkboxdelegate.h"#include "comboboxdelegate.h"#include "mytableview.h"#include <QSqlD...
24 июня 2019 г. 11:16
BlinCT

Хорошо, с этим понятно. Вот есть такой набор каких то кнопок. Цифры отображают в каком порядке должен менятся фокус.1. Как правильнее сделать отображение активного обьекта...
e
24 июня 2019 г. 10:58
evgenm27

Спасибо за ответ, буду пробовать
Ищу работу?
10,000.00 руб. - 15,000.00 руб.
Нужен помощник для создания API.
Moscow, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
Присоединяйтесь к нам
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB