将文本文件的值加载到数组中

时间:2013-11-24 22:21:25

标签: c++ text-files multidimensional-array fstream

我从图形生成器生成的文本文件类似于:

:0 0|-   1|82  2|72
:1 0|87  1|-   2|74
:2 0|86  1|53  2|-

这些应该代表节点和它们的距离。 第1行是:1 1 | - 2 | 82 3 | 72 它是说从节点0到节点0(0 | - )的距离是 - (无穷大)

并且从节点0到节点1(1 | 82)是82

并且从节点0到节点2(2 | 72)是72

但我想将值加载到2d数组中。 上面的数组应该是

Graph[0][0] = -
Graph[0][1] = 82
Graph[0][2] = 72
etc... 

我只是不确定当我在txt文件中读取时如何捕获:0& :1& :2然后将1 | 5分开。

任何帮助都会很棒! 谢谢!

2 个答案:

答案 0 :(得分:0)

一个问题是那些-个字符。如果您使用0替换它们,则可以使用类似以下代码的内容:

// Open the file like this:
// std::ifstream fin ("whatever.txt");

char dummy;
for (int i = 0; i < n; ++i)
{
    int x, d;
    fin >> dummy >> x;  // read ":1", etc.
    assert (dummy == '=');
    assert (x == i + 1);
    for (int j = 0; j < n; ++j)
    {
        fin >> x >> dummy >> d;  // read "2|42", etc.
        assert (dummy == '|');
        assert (x == j + 1);
        Graph[i][j] = d;
    }
}

所有这些assert都是为了确保文件中的冗余数据符合预期。并且不要忘记将所有' - '替换为'0'。

你可以看到我在那里做的事情。我正常读取整数,并在':''|'符号时读取字符。

答案 1 :(得分:0)

一种简单的C方法,您可以将其重写为C ++或仅使用原样。毕竟,这看起来不像C ++关键代码。

请注意fgets使用最大长度(授予,C ++字符串可以更好地工作)和#define用于“无限”,因为您无法存储这个价值以合理的方式。它假设您的所有距离都是正的,并且您的数据正如您所示(即,没有任何意外,例如巨大的数字&gt; MAX_INT,或者间距不一致)。

cin的常用C ++方法在这里效果不好,fscanf也没有用,因为在这两种情况下你需要读取一个字符,确定它是否是一个-,如果没有重新读取它自己以及它后面的任何数字。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_DATA_LENGTH 120
#define DIST_INFINITY   0xFFFFFFFF

unsigned int Graph[10][3];

int main (void)
{
    FILE *fp;
    char input_string[MAX_DATA_LENGTH], *token_ptr;
    int graph_counter = 0, i;

    fp = fopen ("graph.txt", "rt");
    if (!fp)
    {
        printf ("data not found\n");
        return -1;
    }

    do
    {
        if (fgets (input_string, MAX_DATA_LENGTH, fp) == NULL)
            break;
        token_ptr = input_string;
        for (i=0; i<3; i++)
        {
            token_ptr = strchr (token_ptr, '|');
            if (!token_ptr || !token_ptr[1])
                break;
            token_ptr++;
            if (*token_ptr == '-')
                Graph[graph_counter][i] = DIST_INFINITY;
            else
                Graph[graph_counter][i] = strtoul (token_ptr, NULL, 10);
            token_ptr++;
        }
        if (i < 3)
            break;
        graph_counter++;
    } while (1);

    for (i=0; i<graph_counter; i++)
        printf ("Graph[%d] = %u %u %u\n", i, Graph[i][0], Graph[i][1], Graph[i][2]);

    return 0;
}