Zamiana std::vector na char*

0

Witajcie,
mam taką oto funkcję wczytującą mi wykres z pliku w graficznej aplikacji Qt:

void MainWindow::on_actionOpen_triggered() {
     QString FileName;
     FileName = QFileDialog::getOpenFileName(this, tr("Open File"),"/home", tr("Data (*.dat)")); 
     QFile file(FileName);
     if (!file.open(QIODevice::ReadOnly))
     return; 
           file.read(reinterpret_cast<char*>(chart->data),chart->dataSize*sizeof(double)); file.close();
     repaint();
}

Funkcja ta działa pod warunkiem, że składowa data jest double . Chcę to jakoś znormalizować i pozbyć się raw pointerów, dlatego chciałem użyć std::vector<double> i o ile taka zmiana dla funkcji zapisu(korzystającej z file.write() która jako pierwszy argument przyjmuje const char) nie stanowi problemu. Tak w tej funkcji, file.read() potrzebuje nie const char*, a char* i niestety wszystkie próby kończą się niepowodzeniem. Jakiś pomysł, jak zrobić z vectora char*, tak żeby można go było użyć w file.read?

Próbowałem już tworzyć stringa z vectora, a potem go kopiować do char *, ale bez efektu.

2

&vec[0] lub vec.data() zwraca mutowalny wskaźnik na 1. element wektora, więc nie rozumiem problemu.

0

Jej, ale wstyd.
A ja kombinowałem z wrzucaniem wektora do stringa, robieniem z tego daty i innych tego typu rzeczy, a tu takie proste rozwiązanie. :(

0

A czemu nie QFile::readAll() zwracające QByteArray, z którym to możesz zrobić bardzo wiele?

1

Offtopic: Zawsze jak w jednej funkcji widzę kombinację taką jak to: QFile + repaint, to mi się płakać chce.

0
MasterBLB napisał(a):

A czemu nie QFile::readAll() zwracające QByteArray, z którym to możesz zrobić bardzo wiele?

@MasterBLB

auto byteArrayBuffer = file.readAll();
auto begin = reinterpret_cast<double*>(byteArrayBuffer.data());
auto end = begin + byteArrayBuffer.length();

chart -> data = std::vector<double>(begin, end);

tak będzie okej?

E: mile widziana wskazówka jak zastąpić coś takiego w funkcji zapisu:

file.write(reinterpret_cast<char*>(chart -> data.data()),chart->dataSize*sizeof(double)); 
0
auto end = begin + byteArrayBuffer.length();

Nie powinno być jak poniżej?

auto end = begin + byteArrayBuffer.length()/sizeof(double);
0

A dlaczego? Mógłbyś rozwinąć? Ogólnie nie wiem czemu dałem length, zamiast size.

1

Bo inaczej wczytasz n doubli z tablicy zawierającej n bajtów.

0
Tenonymous napisał(a):

@MasterBLB

auto byteArrayBuffer = file.readAll();
auto begin = reinterpret_cast<double*>(byteArrayBuffer.data());
auto end = begin + byteArrayBuffer.length();

chart -> data = std::vector<double>(begin, end);

tak będzie okej? 

A weź obczaj w dokumentacji Qt cóż takiego robi QByteArray::toDouble() ;]

EDIT:
Dla kilku double'i będzie tak:

QByteArray array = file.readAll();
QDataStream in(array);
QVector<double> vector;
in >> vector; //jak bardzo Bracie chcesz to QVector ma metodę toStdVector()

1 użytkowników online, w tym zalogowanych: 0, gości: 1