2013-10-24 2 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 원하는대로 작동하지 않습니다.

어떤 이유로 든 모든 라인에서 변수 "line"은 자체적으로 씁니다. 대신 파일로 출력하는 것이 아니라 새 줄을 인쇄하여 새 줄을 인쇄하는 것이 좋습니다. 올바르게 사용하고 있습니까?

예 : 에 전달되는 명령 줄 인수 yo.txt을 사용합니다.

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

'output.txt'을'w' 모드로 열었습니다. 그렇게 할 때마다 이전에 작성된 모든 내용을 잘라 버립니다. –

답변

3

당신은 다음 단계로 이동하면 즉

다시 같은 출력 파일을 열,

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

대신 제공 FileOpen에 함수 인수로 출력 파일에 파일 포인터를 전달합니다. 첫 번째 파일을 열기 전에 출력 파일을 열고 fileOpen에 전달해야합니다.

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

단순히'fopen ("output.txt", "a"); 속임수를 써야합니다 (파일은 재귀 호출 전에 어딘가에서 지워 져야합니다). –

+0

좋습니다, 감사합니다. 필자는 파일을 반환하기 위해 FILE을 반환하는 다른 함수를 만듭니다. 하나 더 문제가 있습니다. fcloseall()은 재귀 적 스택에서 읽기가 끝나기 전에 모든 파일을 닫습니다. main 함수에서이 명령을 사용할 수 있습니까? 다른 기능의 파일을 닫을 수 있습니까? – juice

+0

@ 주스 : 왜 함수 * 안에 * 열어 두는 * 파일을 닫지 않습니까? Windows의 경우 적어도 "열린 파일"수에 제한이 있습니다 (깊이 재귀를 사용하면 문제가 될 수 있음). – usr2564301

관련 문제