【发布时间】:2016-07-27 11:06:13
【问题描述】:
我正在尝试使用以下代码对给定图形进行 DFS 搜索:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <queue>
typedef struct G{
int vertex1;
int vertex2;
float num;
} graph;
typedef struct adj{
std::vector<int> element;
}adj;
void dfs (int v, bool marked[], adj*p){
marked[v]=true;
std::vector<int>::iterator i;
for (i=p[v].element.begin(); i!=p[v].element.end();i++){
if (!marked[*i]){
dfs(*i, marked, p);
}
}
}
void Search(adj*p, int*tvertex){
bool *marked=new bool[*tvertex];
for (int v=0; v<*tvertex; v++){
marked[v]=false;
}
for (int v=0; v<*tvertex;v++){
if (marked[v]==false){
dfs(v, marked,p);
}
}
}
void buildadj(graph*g, adj*p, int * tvertex, int *edge ){
for (int e=0; e<*edge; e++){
p[g[e].vertex1].element.push_back(g[e].vertex2);
p[g[e].vertex2].element.push_back(g[e].vertex1);
}
}
void readInData(FILE *fp, graph*g, int *tvertex) {
char buffer[500];
char *token;
const char delimiters[] = " ";
int i;
int n;
memset(buffer, 0, 499);
for(i = 0;!feof(fp);) {
i++;
if (i>=2){
fscanf(fp, " %[^\n]", buffer);
token = strtok(buffer, delimiters);
n = (int) atoi(token);
g[i-2].vertex1 = n;
g[i-2].vertex2 = (int) atoi(strtok(NULL, delimiters));
g[i-2].num = (float)atof(strtok(NULL, delimiters));
}
}
}
void readstrct(FILE *fp,int*edge, int*tvertex){
int i;
int a[2];
while (EOF!=fscanf(fp, "%d\n", &a[i])) {
i++;
if(i>=2){
break;
}
}
*tvertex=a[0];
*edge=a[1];
}
void sendMessage() {
char message[200];
sprintf(message, "Wrong Format\n");
printf("%s", message);
}
int main(int argc, char * argv[]) {
FILE *fp;
int edge;
int tvertex;
if(argc < 2) {
printf("File not given\n");
sendMessage();
return 0;
}
fp=fopen(argv[1], "r");
if(fp == NULL) {
printf("file not found\n");
sendMessage();
return 0;
}
readstrct(fp,&edge, &tvertex);
graph *g=new graph[edge];
adj *p=new adj[tvertex];
readInData(fp, g, &tvertex);
buildadj(g,p,&tvertex, &edge);
Search(p,&tvertex);
}
输入的格式如下:
- 13
- 13
- 0 5 2.1
- 4 3 2.3
- 0 1 3.2
- 9 12 4.2
- 6 4 5.1
- 5 4 2.2
- 0 2 0.2
- 11 12 0.22
- 9 10 0.22
- 0 6 0.22
- 7 8 0.22
- 9 11 0.22
- 5 3 0.22
请重点关注读取数据的readstruct和readIndata函数
并存储。我打算阅读前两行(13 和 13)并存储这些
'readstruct' 函数中的边和顶点数两个值。
读完第1行和第2行,if条件满足,出去
循环。
第 3 行和第 15 行在 i 大于 1 时被读取到 readIndata 中
由于每行包含三个数据和它们之间的空间,我使用了字符数组
存储它们并逐个字符读取。分割错误
错误显示当代码到达行时继续读取文件
readIndata 函数中的15(或 i=13),它应该停止。所以我猜
文件指针或 fscanf 函数出现问题。
最好的
【问题讨论】:
-
不要这样混合 C 和 C++。
-
好的,但我想知道这是否是问题的原因
-
始终检查
fscanf的返回值,以便捕获EOF 和 解析错误(例如在有文本时尝试读取数字)。 -
另外,请正确缩进您的代码。试图找出严重缩进代码的问题基本上是故意使问题更难解决。
-
对不起,这是我的第一篇文章。我自己也很困惑,因为这个错误完全没有意义。我重新编辑了帖子。希望现在更有意义。
标签: c++ user-input eof scanf