2017-06-05 24 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);