2015-08-03 3 views
1

Я пытаюсь читать из файлов и записывать во временный файл. Тем не менее, я застрял в бесконечном цикле прямо сейчас. Функция ниже называется несколько раз рекурсивной функцией, которая проходит через каталоги для чтения файлов.Прочитайте один файл и напишите другому 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); 
    } 
} 
+0

Уверены, что оно застрял в петле? Вы пробовали переходить через код, по очереди, в отладчик, чтобы убедиться, что код, который вы показываете, является проблемой? Может быть, это код, проходящий через каталог, который вызывает проблему, когда вы вдруг создаете новый файл? Вы должны действительно научиться использовать отладчик, чтобы помочь вам с такими проблемами. –

+0

Кроме того, почему вы открываете временный файл в * двоичном * режиме? (Это не должно вызывать проблемы, но если вы пишете текст, тогда откройте его в текстовом режиме.) –

+0

Не так ли, если вы входите в каталог, а затем пишите в ./tmp, вы можете на самом деле В конце концов, прочитайте этот файл ./tmp снова, как только вы снова залезете в рекурсию? –

ответ

2

Там нет ничего в вашем коде, который предполагает бесконечный цикл. Однако, если fileName очень большой, вы можете открывать и закрывать «.. \ tmp» миллионы раз. Как указывает Joachim Pileborg в комментариях, вы должны открыть этот файл только один раз в начале вашей функции и снова закрыть его в конце.

Если вы хотите убедиться, что вы в не в бесконечном цикле, распечатайте значение ch на каждой итерации.

0

Итак, я сделал это, и это сработало. Но я не понимаю, почему. Может кто-нибудь объяснить это, пожалуйста?

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 
    } 
} 
+0

Просто угадай, но, возможно, он не был взят (ранее), но * появился *, потому что он быстро * очень медленно, потратив много времени на открытие и закрытие (вывод) файла снова и снова (один раз почти для каждого характер каждого файла). Кроме того, возможно, он выглядел так, как будто он застрял после того, как был выведен первый символ, потому что файл был опустошен и перезаписан каждый раз («a» добавил бы к концу файла ... но «w» начинается с пустого файл при каждом открытии) ... поэтому выходной файл никогда не будет иметь больше 1 символа (или «Некоторого текста»). – Dmitri

Смежные вопросы