将文本文件的值加载到数组中
loading values of a text file into an array
我从图形生成器生成的文本文件类似于:
: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;
}
相关文章:
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 保存/加载大量短数组到二进制文件
- 加载有空指针的字符数组的打印值
- 如何将字符串加载到BYTE*数组(C++)的元素中
- 如何将统一缓冲区对象数组加载到着色器中?
- 加载字节数组(从内存)到libpng c
- 当将多个TypedArrayContents数组加载到V8数组中时(数组数组)时,最后一个元素将覆盖所有元素
- 从字节数组加载 QImage,而无需知道格式
- 在 qml 中从字节数组加载到图像
- 如何使用 for 循环将元素加载到我的每个数组中,然后将每个数组的总和输出到一个 sum 数组中
- 如何将OpenCV的Mat结构的部分图像矩阵加载到我自己的3x3数组中?
- 尝试将文本文件加载到动态分配的 2D 数组中时出现'Segmentation fault'错误
- 试图打印出/加载2D数组时的分割故障
- 程序未正确加载数组
- 我们如何将电路板从 TXT 文件加载到二维数组中(没有行大小和列大小)
- 在 OpenCV 中加载像素值数组
- 数组未加载 - "index out of range in objectAtIndex()"
- 从C++中的文件加载的数组中获取输出
- 从一个文本文件加载多个 char 和 int 类型的数组
- 在对象上重载 sum 运算符时,无法可靠地将两个 int 数组加在一起?