【问题标题】:Issue of reading input from fscanf从 fscanf 读取输入的问题
【发布时间】: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);
   }

输入的格式如下:

  1. 13
  2. 13
  3. 0 5 2.1
  4. 4 3 2.3
  5. 0 1 3.2
  6. 9 12 4.2
  7. 6 4 5.1
  8. 5 4 2.2
  9. 0 2 0.2
  10. 11 12 0.22
  11. 9 10 0.22
  12. 0 6 0.22
  13. 7 8 0.22
  14. 9 11 0.22
  15. 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


【解决方案1】:

您必须首先在readstrct() 中初始化i。正如帖子现在所说,它被用作整数数组a的索引。

【讨论】:

  • @Sean,请更新您帖子中的代码以反映这一点,以及您所做的任何其他更新。当它显示您已测试的最新版本,但仍然出现错误时,我会很高兴再次查看。
猜你喜欢
  • 1970-01-01
  • 2010-11-06
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多