2013-10-24 23 views
0
void fileOpen(char * fname) 
{ 
    FILE *txt, *newTxt; 
    char line[256]; 
    char fileName[256]; 

    txt = fopen(fname, "r");  
    if(txt == NULL) 
    { 
     perror("Error opening file"); 
     exit (EXIT_FAILURE); 
    } 

    newTxt = fopen("output.txt", "w"); 
    if(newTxt == NULL) 
    { 
     perror("Error opening file"); 
     exit(EXIT_FAILURE); 
    } 
    //Problem is in the while loop 
    while(fgets(line, 256, txt) != NULL) 
    { 
     if (strncmp(line, "#include", 7) == 0) 
     { 
      strcpy(fileName, extractSubstring(line)); 
      fileOpen(fileName); 
     } 

     else 
      fprintf(newTxt, "%s", line); <---- It just prints over itself 
    } 

    fcloseall(); 
} 

程序的重點是遞歸文件提取。每次它在行首看到#include時,都會打印出文件的內容。fprintf不按我想要的方式運行

由於某些原因,在每一行中,變量「行」只是寫在自己身上。相反,我希望它不是打印輸出到一個文件中,然後在新行中打印出新行。我是否正確使用它?

示例:我使用的命令行參數yo.txt傳遞給void fileOpen(char *fname)

yo.txt

Hello stackoverflow. 
#include "hi.txt" 
Thank you! 

hi.txt

Please help me. 

預期最終結果:

Hello stackoverflow. 
Please help me 
Thank you! 
+1

可能會在fprintf中添加''\ n''? – Kninnug

+1

'perror(fname)','perror(fname)','perror(fname)'!!!!!如果我看到另一條錯誤消息,告訴我該消息適用的文件的名稱,我會尖叫。 –

+1

您正在'w'模式下打開'output.txt'。每當你這樣做,你截斷(丟棄)以前寫的所有東西。 –

回答

3

當你移動到一個新的水平,即

strcpy(fileName, extractSubstring(line)); 
fileOpen(fileName); 

你再次打開相同的輸出文件,

newTxt = fopen("output.txt", "w"); 

文件指針而是傳遞到輸出文件作爲函數參數FILEOPEN。在打開第一個文件之前,您應該打開輸出文件並將其傳遞給fileOpen。

void fileOpen(char * fname, FILE* output) 
+0

爲什麼不簡單地'fopen(」output.txt「,」a「);'?應該做的訣竅(雖然該文件必須在遞歸調用之前的某個地方被擦除)。 –

+0

好吧,這是有道理的,謝謝。我使另一個函數返回一個文件來專門打開文件。 我還有一個問題。 fcloseall()在完成讀取之前關閉所有文件(在遞歸堆棧上)。 我可以在主函數中使用該命令嗎?它還會關閉其他功能中的文件嗎? – juice

+0

@juice:爲什麼不只是*關閉*你在功能內打開的文件?在Windows上,至少,可以擁有的「打開文件」數量最多(順便說一下,這將是一個問題,具有深度遞歸)。 – usr2564301

相關問題