2015-06-16 2 views
0

Я как бы новичок в использовании потоков и обработке FileWriter. Это то, что я получил путем поиска примеров/решений:Write/Read Struct To/From File

struct vertex_info{ 
    QPointF pos; 
    int type; 
}; 


struct graph_info{ 
    vertex_info all_vertices[]; 
}; 



QDataStream &operator<<(QDataStream &out, const vertex_info &v){ 

    out << v.pos << v.type; 
    return out; 
} 


QDataStream &operator<<(QDataStream &out, const graph_info &g){ 

    int n = sizeof(g.all_vertices); 

    for(int i=0; i<n ;i++){ 
     out<<g.all_vertices[i]; 
    } 

    return out; 
} 




QDataStream &operator>>(QDataStream &in, graph_info &g){ 
     //vertex_info vertex_array[]; 

     return in; 
} 



QDataStream &operator>>(QDataStream &in, vertex_info &v){ 

     return in; 
} 






void MainWindow::on_button_save_clicked(){ 
    QString s = this->ui->lineEdit->text(); 
    this->ui->lineEdit->clear(); 

    vmap::iterator itr = myLogic->set.begin(); 
    graph_info my_graph; 


    vertex_info vinfo; 
    int i = 0; 

    while(itr != myLogic->set.end()){ 
     vinfo.pos = itr->second->pos; 
     vinfo.type = itr->second->type; 
     my_graph.all_vertices[i] = vinfo; 
     itr++; 
     i++; 
    } 


    QFile file("test.dat"); 
    file.open(QIODevice::WriteOnly); 
    QDataStream stream(&file); 
    stream << my_graph; 

    file.close(); 
} 



void MainWindow::on_button_load_clicked(){ 
    this->on_button_clear_clicked(); 
    graph_info my_graph; 
    QString s = this->ui->box_select_graph->currentText(); 

    QFile file("test.dat"); 
    file.open(QIODevice::ReadOnly); 
    QDataStream in(&file); 
    in >> my_graph; 

    int i=0; 
    while(i<sizeof(my_graph.all_vertices)){ 
     QString posx = QString::number(my_graph.all_vertices[i].pos.x()); 
     QString posy = QString::number(my_graph.all_vertices[i].pos.y()); 
     QString type = QString::number(my_graph.all_vertices[i].type); 
     cout<<posx<<" "<<posy<<" "<<type<<'\n'; 
    } 
} 

Так что я все еще не реализовать в потоках для обеих структур, так как я действительно не знаю, как это работает.

Любые предложения/решения? :/

+0

Подробнее о [сериализации] (https://en.wikipedia.org/wiki/Serialization). Для сложных структур данных прагматически целесообразно использовать текстовый формат, например [JSON] (http://json.org/) –

ответ

0

Во-первых, я предполагаю, что вы используете C++ здесь. Таким образом, в struct graph_info вы будете хотеть

std::vector<vertex_info> all_vertices; 

Тогда в QDataStream &operator<< вы будете хотеть

size_t n = g.all_vertices.size(); 

Также в QDataStream &operator<< вы, вероятно, будете хотеть, чтобы написать число вершин, чтобы поток, так что читатель сможет прочитать, что сначала знать, сколько читать.

После того, как вы это сделаете, вам станет лучше, если вы начнете писать операторы >>.

+0

Thx для быстрого ответа, да его C++. Поэтому теперь я использую вектор вместо списка или массива, но я до сих пор не знаю, как реализовать эти потоки. Есть ли где-нибудь очень простой пример? – droelf

Смежные вопросы