2017-06-05 35 views
-1

我是一个递归的新手。我如何在递归函数中使用fopenfclose文件?如何在递归下对文件进行fprintf

void make(LINK lis, char *name, int flag, FILE *f) 
{ 
    if (lis == NULL) { 
     fclose(f); 
    } 
    else { 
     if (flag == 0) { 
      FILE *f = fopen(name, "w"); 
      flag = 1; 
     } 
     else { 
      fprintf(f, "CODICE: %d\n", lis->d.codice); 
      make(lis->next, name, 1, f); 
     } 
    } 
} 

我的目标是在文件中递归地写“codice” - > CODE。

+0

你的[mcve]不编译,我不明白你的问题。 – Stargateur

+0

这不是递归的。 'make'和'crea'应该是相同的功能吗? – Prune

+0

你为什么要递归呢?这种情况下迭代处理效果更好,原因很明显:您不明白如何打开和关闭文件。 – Prune

回答

1

你最直接的问题是,在第一次调用时,你打开文件,然后返回到主程序,而不进行任何处理。打开文件应该是一个简单的测试,而不是一个if-then-其他

void make(LINK lis, char *name, FILE *f) 
{ 
    if (!lis) { 
     fclose(f); 
    } 
    else { 
     if (f) { 
      f = fopen(name, "w"); 
      } 
     fprintf(f, "CODICE: %d\n", lis->d.codice); 
     make(lis->next, name, f); 
     } 
    } 
} 
0

怎样的fopen和递归函数FCLOSE文件?

一定要在递归的同一级别这样做。


首先考虑如何在第n个和第一个将分别看:

void make_nth(LINK lis, FILE *outf) { 
    if (lis) { 
    fprintf(outf, "CODICE: %d\n", lis->d.codice); 
    make_nth(lis->next, outf); 
    } 
} 

void make_1st(LINK lis, const char *name) { 
    FILE *f = fopen(name, "w"); 
    if (f) { 
    make_nth(lis, f); 
    fclose(f); 
    } 
} 

// Usage 
LINK lis = ...; 
make_1st(lis, codice.txt); 

现在这身打扮。有多种方式可以做到这一点。

void make(LINK lis, const char *name, FILE *outf) { 
    if (name) { 
    assert(outf == NULL); 
    FILE *f = fopen(name, "w"); 
    if (f) { 
     make(lis, NULL, f); 
     fclose(f); 
    } 
    } else { 
    if (lis) { 
     fprintf(outf, "CODICE: %d\n", lis->d.codice); 
     make(lis->next, NULL, outf); 
    } 
    } 
} 

// Usage 
LINK lis = ...; 
make(lis, codice.txt, NULL);