用递归函数读取数据

时间:2014-07-30 10:44:28

标签: c

我正在从文件中读取一些彼此嵌套的数据(如文件树),以将其放入数组中。

阅读完成得很好,但我无法将数组放回main()。 AnzGrid的结果为0,因此for循环不会启动。

有没有人暗示我该怎么做?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void read_include(int,int*,char*);

void read_include(int AnzGrid,int* GridIDs,char* Input){
    char Line[81];
    char* Token;
    FILE * File;
    FILE * File1;

    File = fopen(Input,"r");
    printf("opening %s\n",Input);

    if (!File){
      printf("%s not found here\n",Input);
      return;
    }
    if (File){
        while (fgets(Line,80,File)){
            printf("%s",Line);
            if (strncmp(Line,"GRID    ",8) == 0){
                Token=strtok(Line," ");
                Token=strtok(NULL," ");
                GridIDs[AnzGrid] =atoi(Token);
                AnzGrid++;
            }
            if (strncmp(Line,"INCLUDE ",8) == 0){
                Token=strtok(Line,"'");
                Token=strtok(NULL,"'");
                read_include(AnzGrid,GridIDs,Token);
            }
        } 
        fclose(File);
    }
    printf ("%i\n",AnzGrid);
    return;
}


int main( int argc, char* argv[] )  {
    char Input[81];
    int i;
    int AnzGrid; 
    int GridIDs[100];
    strcpy(Input,argv[1]);


    read_include(AnzGrid,GridIDs,Input);
    printf ("=>%i\n",AnzGrid);

    for (i=0;i<AnzGrid;i++){
    printf ("GridID: %i\n",GridIDs[i]);
 }

2 个答案:

答案 0 :(得分:2)

这是因为当您将参数传递给函数时,它们会按值传递 ,换句话说,您传递的参数的值是复制在函数中。这也意味着您对函数内的参数所做的任何更改都是在副本上进行的,一旦函数返回,这些更改将会丢失。

在C语言中基本上有两种解决方法:

  1. 使用return

  2. 从函数返回值
  3. 通过传递指向数据的指针并使用函数内的解除引用运算符来模拟pass by reference

  4. 第二种选择可能需要一些示例代码:

    /* Passing `AnzGrid` as a pointer */
    void read_include(int *AnzGrid,int* GridIDs,char* Input){
        ...
        (*AnzGrid)++;  /* Using the dereference operator */
        ...
    }
    

    通过将AnzGrid声明为指针,但通过使用address-of运算符来调用函数 not

    int main(...) {
        int AnzGrid = 0;  /* Initialize */
    
        ...
    
        read_include(&AnzGrid,GridIDs,Input);  /* Note use of address-of operator `&` */
    
        ...
    }
    

    注意: main函数的代码段中,我还修复了另一个错误,一个导致undefined behavior:您没有初始化AnzGrid变量。局部变量不会自动初始化,而是它们的值 indeterminate (并且看似随机)。使用未初始化的局部变量而不初始化它会导致提到的未定义行为。例如,如果AnzGrid具有不确定的值,AnzGrid++会做什么以及结果会是什么?

答案 1 :(得分:0)

您的read_include函数应该返回一个malloc指向包含读取数据的struct的指针。

当然,您应该采用read_include返回堆分配指针的约定,以及free 以后

顺便说一句,您应该使用所有警告和调试信息编译代码(例如,如果使用GCC,则使用gcc -Wall -g)并且您应该学习如何使用调试器(例如gdb