2015-02-27 3 views
2

Я пытаюсь написать программу, которая читает в текстовом файле, содержащем несколько строк из 512 элементов. Это числа, разделенные вкладкой, первая строка файла содержит общую информацию о самом файле. Вот что это выглядит как:Запись QVector в текстовый файл в Qt

512 Измерения, проведенные на: Чт 12 июня 18:35:44 2014 Комментарии: ноль
2,4155 1,60983 1,08339 0 2,13321 0 0,848402 0 0,747692 0 0 0.146487 1.98062 0 0.846876 0 1,87991 0,117494 0 0 0 0 1,6907 0 0 0 0,0671397 0,255635 1,33974 1,4313 1,17494 0 0 0 1,83566 0 2,54826 0 0 0 0 0 1,80819 0 0 0 0 0 4,78523 0 1,00283 0 2,63676 0 2,19272 0,9262844 0,245635 0,762951 0,581369 0 0 0,689708 1,38552 2,38193 1,1391 3,2118 0,712596 0 0.508125 0 0 0 0,842298 0,794995 0.967422 0.820935 0.0534066 2,67338 0

и т.д. и т.п.

Каждый из 512 столбцов представляет отдельный поток данных и строки отбираются со временем. Программа вычисляет интеграл данных так, что он выплескивает вектор с 512 элементами, каждый элемент представляет собой сумму всех данных в соответствующем столбце.

Неотъемлемая часть работает отлично, я могу печатать выходные данные вектора с помощью qDebug, но когда я пытаюсь записать вектор в текстовый файл, я получаю сообщение об ошибке.

Вот код, я использую:

void MainWindow::on_pushButton_clicked() 

QVector<double> SingleLineData; 
SingleLineData.resize(512); 
QString test; 
QString inputfile = QFileDialog::getOpenFileName(
      this, 
      tr("Open File"), 
      "/Users", 
      "All files (*.*)" 
      ); 

if(inputfile != ""){ 
QFile file(inputfile); 


if(!file.open(QFile::ReadOnly)){ 
    } 
QTextStream in(&file); 


    double buffer; 

    while(!file.atEnd()){ 
     in.readLine(); 
     for(int i=0; i<512; i++){ 
      in >> buffer; 
      SingleLineData[i]+=buffer; 
     } 
    } 

} 
    qDebug() << SingleLineData; 

// ************* ************* выходной файл *************************************

QString filename = "/Users/Mitch/Desktop/integral.txt"; 
QFile fileout(filename); 
if (fileout.open(QFile::ReadWrite | QFile::Text)){ 
} 
    QTextStream out(&fileout); 
    out << SingleLineData; 
    fileout.close(); 

}

И ошибка принимается:

ошибка: недопустимые операнды для двоичного выражения ('QTextStream' и «QVector») и Функция кандидата не жизнеспособна: неизвестное преобразование из «QVector» в «const void *» для 1-го аргумента; введите адрес аргумента с & QTextStream & оператор < < (const void * ptr);

Любая помощь была бы высоко оценена! :)

ответ

2

Это итераторный метод. Оператор для QTextStream не перегружается, чтобы принять вектор. Тем не менее, он может принять двойной.

QString filename = "/Users/Mitch/Desktop/integral.txt"; 
QFile fileout(filename); 
if (fileout.open(QFile::ReadWrite | QFile::Text)){ 
QTextStream out(&fileout); 
for (Qvector<double>::iterator iter = SingleLineData.begin(); iter != SingleLineData.end(); iter++){ 
    out << *iter; 
} 
fileout.close(); 
} 
+0

Спасибо melevan, что, похоже, решила ошибку. Я думаю, что выход будет шестнадцатеричным, любой способ преобразовать его в обычный текст/регулярные числа? Вот пример вывода: 0x7fd09306a0180x7fd09306a0200x7fd09306a0280x7fd09306a0300x7fd09306a0380x7fd09306a0400x7fd09306a0480x7fd09306a0500x7fd09306a0580x7fd09306a0600x7fd09306a0680x7fd09306a0700x7fd09306a0780x7fd09306a0800x7fd09306a0880x7fd09306a0900x7fd09306a0980x7fd09306a0a00x7fd09306a0a80x7fd09306a0b00x7fd09306a0b80x7fd09306a0c00x –

+0

Так что я экспериментировал с удалением * перед тем ИТЭР, когда его просто ИТЭР то данные печатаются неправильно в шестнадцатеричном, но с * ITER его штрафом.Являясь довольно новым для C++, я не понимаю, почему использование * заставляет его работать, что-то делать с указателями? Итак, теперь его работа печатает номера, но нет разделителя, так или иначе, чтобы добавить запятую и пробел, как 122112, 12121435, 242425235 и т. Д. И т. Д. –

+0

Хорошо, это было так же просто, как добавление << "," to out << * iter По-прежнему интересно, почему указатель нужен для итера? –

1

Как указано в сообщении об ошибке, нет перегрузки QTextStream, которая принимает QVector<double>, но есть для double. Так что просто перебирайте элементы и парите их отдельно.