C++ 将文本文件的值加载到数组中
我从图形生成器生成的文本文件类似于:C++ 将文本文件的值加载到数组中,c++,text-files,multidimensional-array,fstream,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行是:11 |-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
:0 0|- 1|82 2|72
:1 0|87 1|- 2|74
:2 0|86 1|53 2|-
它们应该表示节点和到它们的距离。
第1行是:11 |-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;
}
}
//按如下方式打开文件:
//std::ifstream-fin(“whatever.txt”);
模拟字符;
对于(int i=0;i>虚拟>>x;//读取“:1”等。
断言(虚拟='='=');
断言(x==i+1);
对于(int j=0;j>x>>dummy>>d;//读“2 | 42”等。
断言(dummy=='|');
断言(x==j+1);
图[i][j]=d;
}
}
所有这些assert
s都在那里,以确保文件中的冗余数据与预期的一样。别忘了用“0”替换所有“-”
你可以看到我在那里做什么。我通常在阅读整数时,读一个字符,当<代码>:‘<代码> >代码> > <代码>符号> ./p> 一个简单的C方法,你可以改写为C++,或者只是按原样使用。毕竟,这看起来不像C++的关键代码。
注意,使用最大长度为<>代码> fgs<代码>(当然,C++字符串在这里可以更好地工作),而<代码>定义“无限”的,因为不能以合理的方式存储这个值。它假设您的所有距离都是正的,并且您的数据如您所示(即,没有意外情况,如巨大的数字>最大值,或不一致的间距)
<> >#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;
}
#包括
#包括
#包括
#定义最大数据长度120
#定义距离无穷大0xFFFFFF
无符号整数图[10][3];
内部主(空)
{
文件*fp;
字符输入字符串[最大数据长度],*标记ptr;
int图_计数器=0,i;
fp=fopen(“graph.txt”、“rt”);
如果(!fp)
{
printf(“未找到数据”);
返回-1;
}
做
{
if(fgets(输入字符串,最大数据长度,fp)==NULL)
打破
令牌\u ptr=输入\u字符串;
对于(i=0;i你什么意思把1 | 5
分开?在哪里?如果你认为你的输入文件和你在手工编码数组中的表示之间的关联是非常清楚的,让我现在向你保证;它不是。你可以把你的文件变成一个字符串并从那里对字符进行索引。但是,我仍然对你的数组的方式很模糊“-Field:”是“放弃”C++,只使用“代码> fGED/CODE”并“手动”解析。但在OP使用的任何数据类型中,仍然需要一种保存“无穷大”的方法;<代码>图[0 ] [0 ]=-/COD>只适用于字符串。第二个想法是:从节点到自身的距离是0,而不是一些巨大的距离。(也许是为了阻止无限回溯?)意大利面:这C++是解决OP问题的最简单的代码。我不认为指针式的SPAGHETTI/PARSE解析/正则表达式是很好的解决方案。同样,正如我在回答中提到的,用<代码> 0代码>代码>替换“代码> >代码>使解析变得更容易。是的,它是C++的解决方案,其中的Jongware是纯C(……指针式意大利面?)?。但是,您放弃了'-'=INF
,并建议OP更改其数据。我认为这完全没有必要。@Jongware:我并不是说您的代码很糟糕。我想说的是,考虑到OP的问题,我认为任何使用指针操作和手动字符串处理的代码似乎都远远超出了他/她的C/C++程序级别mming功能,因此我建议对数据进行一点更改(这大大简化了解析代码,并且可以使用文本编辑器实现)这是我能想到的最简单的解决方案。我还假设:0
数字只是行号,而0 |
数字是索引。我的代码很乐意忽略它们,但如果它们意味着什么(例如,您的数据可能从:10
行跳到:12行,您需要保存该信息)它很容易调整。