2017-05-22 1 views
0

J'essaie actuellement de faire le Clique Problem et j'ai rencontré un problème. Je lis un graphique à partir d'un fichier, mais le fichier suit un format particulier:C++ Ignorer certaines chaînes lors de la lecture du fichier

c File p_hat1500-1.clq 
c 
c 
p edge 1500 284923 
e 4 1 
e 5 3 
e 5 4 
e 6 2 

Avant chaque ligne est une lettre indiquant ce qui est sur cette ligne (que ce soit un commentaire (c) ou un bord (e)) , je suis en train de savoir comment je peux lire le fichier et ignorer tous les éléments en dehors des numéros de bord afin qu'il serait plutôt lire comme ceci:

4 1 
5 3 
5 4 
6 2 

jusqu'à maintenant, je suis en train de lire le fichier comme ceci:

ifstream file("graph.clq"); 

et le chargement

file >> n; 
+0

Que voulez-vous dire par "enlever les parties inutiles"? Voulez-vous modifier ce fichier via un programme que vous écrivez? Voulez-vous lire dans le fichier avec seulement les bords? – Curious

+0

Je voulais dire lire le fichier avec seulement les bords. – chariked

Répondre

1

Essayez cette

#include <vector> 
#include <iostream> 
#include <utility> 
#include <fstream> 
#include <string> 

using std::cout; 
using std::endl; 
using std::cerr; 
using std::vector; 
using std::string; 

vector<std::pair<int, int>> read_graph_file(const string& file); 

int main() { 

    auto edges = read_graph_file("input.txt"); 
    for (auto edge : edges) { 
     cout << edge.first << " " << edge.second << endl; 
    } 

    return 0; 
} 


vector<std::pair<int, int>> read_graph_file(const string& file) { 
    auto fin = std::ifstream{file.c_str()}; 
    if (!fin) { 
     throw std::runtime_error{"Could not open file"}; 
    } 

    auto edges = vector<std::pair<int, int>>{}; 

    auto input_type = char{}; 
    while (fin >> input_type) { 
     if (input_type != 'e') { 
      while (fin.get() != '\n') {} 
     } else { 
      auto edge = std::pair<int, int>{}; 
      fin >> edge.first >> edge.second; 
      edges.push_back(edge); 
     } 
    } 

    return edges; 
}