2013-09-06 1 views
0

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

В результате может возникнуть Vector< Vector<String> > (или ваш вкус контейнеров).

Когда я даю это QTableView с использованием QAbstractTableModel, строки и столбцы инвертируются: внешний контейнер фактически обозначает строки, а внутренний контейнер обозначает столбцы.

Я не уверен, что делать, поскольку я хочу представить данные, разрешить некоторые действия по редактированию (редактирование модели ), а затем записать ее в сопоставимый файл.

Мои данные будут составлять около 200 000 строк (людей) на 300 столбцов (значения), и это на самом деле медленнее читать в вектор из файла, но быстрее представить в QTableView, когда я прочитал матрицу в перевернутый способ. При написании его в другой файл, это не так просто на этот раз выписывать транспонированной вектор по сравнению с обычным способом, в котором вы можете просто:

for (int iter = 0; ....; ...) 
{ 
    row = matrix[iter].join(" ") 
    file.write(row) 
} 

я упускаю что-то очевидное? Он должен отображаться инвертированным образом. При подключении модели к представлению я должен транспонировать, или я должен заполнить матрицу изначально перевернутым способом?

ответ

0

Возможно, вы захотите пересмотреть свои структуры данных. Гораздо лучше, с точки кэш-когерентность зрения, способ сделать это может быть, чтобы иметь следующее:

struct Line { 
    QString str; 
    QVector<short> splitPoints; // 2 points per each substring (begin, length) 
}; 

struct File { 
    QVector<Line> lines; 
} 

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