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

loading values of a text file into an array

本文关键字:数组 加载 文本 文件      更新时间:2023-10-16

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

: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。

任何帮助都会很棒!谢谢

一个问题是那些-字符。如果用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"替换所有的"-"。

你可以看到我在那里做什么。我通常读取整数,当':''|'符号为时读取字符。

一种普通的C方法,您可以将其重写为C++,也可以直接使用。毕竟,这看起来不像C++关键代码。

请注意,对于fgets使用最大长度(当然,C++字符串在这里可以更好地工作),对于"无穷大"使用#define,因为您无法以合理的方式存储此值。它假设您的所有距离都是正的,并且您的数据如您所示(即,没有意外,如巨大的数字>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 foundn");
        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 %un", i, Graph[i][0], Graph[i][1], Graph[i][2]);
    return 0;
}