我从图形生成器生成的文本文件类似于:
: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 :(得分: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;
}