如何将文本文件读入c ++(dijkstra输入)

时间:2014-01-10 15:05:35

标签: c++

假设我有一个文本文件,其中包含以下文字:

----Text file----------------------
A B 4 C 2
B D 2 C 3 E 3
C B 1 D 4 E 5
D
E D 1
-----------------------------------

此文件的含义是:从AB的距离为4AC的距离为2,{{ 1}}至BD2BC ...等

我是否应该知道如何将此文件读入c ++程序变量?

我想把它变成不同的集合

3

(A,B,4)
(A,C,2)
(B,D,2)
...
...
(E,D,1)

3 个答案:

答案 0 :(得分:2)

您可以按空格分割整行,将第一个元素作为值并成对解析其余元素。对于每对,请在数据结构中添加新条目。

示例程序完成所有问题:

#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <string>
#include <map>
#include <vector>

using std::ifstream;
using std::map;
using std::cout;
using std::endl;
using std::istringstream;
using std::vector;
using std::pair;
using std::string;

typedef map< string, int > mapping;

map< string, mapping > data;

int main(int argc, char* argv[])
{
    ifstream inputFile("data.dat", ifstream::binary);
    string currentLine;
    while (getline(inputFile, currentLine))
    {
        if (currentLine.length() == 0)
            break;
        istringstream lineStream(currentLine);
        string node, destination;
        int length;
        lineStream >> node;
        while (lineStream >> destination)
        {
            length = 0;
            if (lineStream >> length)
            {
                if (data.find(node) == data.end())
                {
                    mapping newMapping;
                    data.insert(pair< string, mapping >(node, newMapping));
                }
                data[node].insert(pair< string, int >(destination, length));
            }
            else
            {
                cout << "dijkstra format error. exit." << endl;
                return 1;
            }
        }
    }
    inputFile.close();
    for (auto dataIt = data.begin(); dataIt != data.end(); ++dataIt)
    {
        mapping& currentMapping = dataIt->second;
        for (auto mappingIt = currentMapping.begin(); mappingIt != currentMapping.end(); ++mappingIt)
        {
            cout << dataIt->first << " <- (" << mappingIt->second << ") -> " << mappingIt->first << endl;
        }
    }
}

使用您的确切输入文件输出:

A <- (4) -> B
A <- (2) -> C
B <- (3) -> C
B <- (2) -> D
B <- (3) -> E
C <- (1) -> B
C <- (4) -> D
C <- (5) -> E
E <- (1) -> D

答案 1 :(得分:0)

#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <string>

using namespace std;

int main() {
    ifstream inputFile("distance.txt");
    string line;
    std::map<std::pair<std::string, std::string>, int> mapping;
    std::map<std::string, std::string> graph;

    while (getline(inputFile, line)) {
        istringstream ss(line);
        string name;
        ss >> name;
        while(ss >> line) {
             int value = 0;
             if(!(ss >> value)) //error
             graph[name] = line;
             mapping[std::make_pair(name, line)] = value;
        }
    }
}

答案 2 :(得分:0)

如果您更改文件设计我认为它很容易阅读,您可以在白色空格上划线或者您可以使用逗号分隔这里的值设计意味着......

A B C. A 0 3 6 B 1 0 1 C 0 0 7

第一行 它显示了A的所有外边缘。 成本0表明它们在节点之间没有边缘 表格A到A成本为0 表格A到B的费用是3 表格A到c的费用是6 和其他类似的行......