Внутри цикла for входной файл не считывает новые значения в переменные - PullRequest
0 голосов
/ 04 декабря 2018

У меня сейчас проблемы с циклом чтения новых значений в переменные.Он отлично работает для вершин, ребер и начальных переменных, но он будет работать только в первый раз для переменных from_, to_, ​​weight_ и dir.Каждый раз, когда цикл for повторяется после этого, он все еще использует вторую строку (0 1 4 false).Мне стыдно за то, что мне нужно постить за что-то настолько скудное, но я не могу на всю жизнь понять, что происходит.Я включил входной файл, а также функцию, которая используется из файла реализации, который использует объект структуры Edge, который помещается в объект списка в векторе.Пожалуйста, дайте мне знать, если я должен публиковать больше, хотя я думаю, что проблема просто связана с тем, как я использую файл ввода / вывода.

#include "graph.h" 
#include <iostream> 
#include <string> 
#include <vector> 
#include <list> 
#include <limits> 
#include <fstream> 

int main() 
{ 
    std::ifstream infile; 
    infile.open("graph.txt"); 
    int vertices, edges, start; 
    infile >> vertices >> edges >> start; 
    Graph graph(vertices); 
    int from_, to_; 
    double weight_; 
    bool dir; 
    std::cout << "Constructing graph" << std::endl; 
    int i = edges; 
    for (int i=0;i<edges;i++) 
    { 
        infile >> from_ >> to_ >> weight_ >> dir; 
        graph.addEdge(from_, to_, weight_, dir); 
    } 


    infile.close(); 
    return 0; 
}

Входной файл (graph.txt):

6 8 2 
0 1 4 false 
0 2 7.5 false 
1 3 2 false 
1 4 5 false 
2 3 3.1 false 
2 5 6.9 false 
3 4 1 false 
4 5 3 false

Функция в файле реализации:

void Graph::addEdge(int from, int to, double weight, bool isDir) 
{ 
    std::cout<< "Representing edge " << from << "," << to << " weight " 
            << weight << std::endl; 
    Edge e1(from,to,weight); 
    if (adjacent.size() < std::max(from, to) + 1) 
        adjacent.resize(std::max(from,to) +1); 
    adjacent[from].push_back(e1); 
    std::cout << "Edge added" <<std::endl; 
    if (isDir == false) 
    { 
        Edge e2(to,from,weight); 
        adjacent[to].push_back(e2); 
    } 
}

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Чтение bool обычно предполагает поиск 1 или 0.
(Если бы вы проверили, было ли чтение успешным, вы бы заметили, что это не так.)

Выможно использовать манипулятор ввода / вывода std::boolalpha, чтобы вместо этого поток просматривал последовательности символов true и false.

Пример (работает и для выходных потоков):

#include <iomanip>
#include <iostream>
#include <sstream>

int main() {
    std::istringstream in("true false");
    bool value = false;
    in >> std::boolalpha;
    while (in >> value)
    {
        std::cout << std::boolalpha << value << "\n";
    }
}
0 голосов
/ 04 декабря 2018

Вы не можете использовать false и true для логического значения.Строковое представление отсутствует, поэтому попытка синтаксического анализа логического значения в виде строки не удалась.

Использование:

std::string dir;

И затем после:

graph.addEdge(from_, to_, weight_, dir != "false"); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...