簡體   English   中英

讀取一個文件並寫入另一個C

[英]Read one file and write to another C

我正在嘗試從文件讀取並寫入臨時文件。 但是,我現在陷入無限循環。 下面的函數被遞歸函數多次調用,該遞歸函數遍歷目錄以讀取文件。

我的方法是,我將從一個文件中讀取每個單詞,然后將這些單詞讀取到另一個文件中。

如果我只打印每個單詞,我擁有的功能就可以正常工作。 它打印出所有目錄中每個文件中的每個單詞。 但是,當我嘗試開始寫入臨時文件(代碼已注釋掉)時,我陷入了while循環中。

另一方面,如果我只是在測試程序中調用一次函數,那么我只需從當前目錄中的一個文件讀取並寫入臨時文件,就可以了。

這就是我所擁有的(傳入時的fileName實際上是絕對路徑,並且我執行../tmp因此它不會被遞歸函數捕獲):

void fileReadWrite(char *pattern, char *before, char *replace, char *fileName) {
   FILE *file = fopen(fileName, "r");

   if (file != NULL) {
      int ch, word = 0;
      while ((ch = fgetc(file)) != EOF) {
         if (isspace(ch) || ispunct(ch)) {
            if (word) {
               word = 0;
               putchar('\n');
            }
         }
         else {
            word = 1;
            putchar(ch);

            /*
            FILE *f = fopen("../tmp", "wb"); // create and write
            if (f == NULL)
            {    
               printf("Error opening file!\n");       
               exit(1);
            }

            fprintf(f, "Some text"); // Or fprintf(f, ch);

            fclose(f);
            */
         }
      }
      fclose(file);
   }
}

您的代碼中沒有任何東西暗示無限循環。 但是,如果fileName非常大,則可能要打開和關閉“ .. \\ tmp”數百萬次。 正如Joachim Pileborg在評論中指出的那樣,您應該在函數開始時只打開一次該文件,然后在結束時再次將其關閉。

如果要說服自己沒有陷入無限循環,請在每次迭代中打印出ch的值。

好的,所以我做到了,而且奏效了。 但是我不明白為什么。 有人可以解釋嗎?

void fileReadWrite(char *pattern, char *before, char *replace, char *fileName) {
   FILE *file = fopen(fileName, "r");
   FILE *f = fopen("../tmp", "wb"); // MOVE HERE

   if (file != NULL) {
      int ch, word = 0;
      while ((ch = fgetc(file)) != EOF) {
         if (isspace(ch) || ispunct(ch)) {
            if (word) {
               word = 0;
               putchar('\n');
            }
         }
         else {
            word = 1;
            putchar(ch);

            /*

            if (f == NULL)
            {    
               printf("Error opening file!\n");       
               exit(1);
            }

            fprintf(f, "Some text"); // Or fprintf(f, ch);


            */
         }
      }
      fclose(file);
      fclose(f); // MOVE HERE
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM