Member 12957547 Ответов: 1

Не удается заменить слово в файле с помощью языка Си


У меня есть 2 функции заменить и заменить резервным копированием следующим образом:
void replace_j(char* oldWord, char* newWord)
{
    printf("without\n");
    printf("%s\n",oldWord);
    printf("%s\n",newWord);
    FILE * fPtr;
    FILE * fTemp;
    FILE* f;
    char path[100];
    char file[BUFFER_SIZE];
    char buff[BUFFER_SIZE];
 //   char oldWord[100], newWord[100];
    f= fopen("files_to_be_scanned.txt", "r");
    while (!feof(f))
    {
    	fgets(file,sizeof(file),f);
       // file[strlen(file) - 1] = '\0';
    	printf("\nfile is %s\n",file);
        strcpy(path,file);
        printf("path is %s\n",path);
        path[strlen(path) - 1] = '\0';
        fPtr  = fopen(path, "r");
        if(fPtr == NULL)
        {
            perror("error");
        }
        fTemp = fopen("replace.tmp", "w");

        /* fopen() return NULL if unable to open file in given mode. */
        if (fPtr == NULL || fTemp == NULL)
        {
            /* Unable to open file hence exit */
            printf("\nUnable to open file.\n");
            printf("Please check whether file exists and you have read/write privilege.\n");
            exit(EXIT_SUCCESS);
        }


        /*
         * Read line from source file and write to destination
         * file after replacing given word.
         */
        while ((fgets(buff, BUFFER_SIZE, fPtr)) != NULL)
        {
            // Replace all occurrence of word from current line
            replaceAll(buff, oldWord, newWord);

            // After replacing write it to temp file.
            fputs(buff, fTemp);
        }


        /* Close all files to release resource */
        fclose(fPtr);
        fclose(fTemp);


        /* Delete original source file */
        remove(path);

        /* Rename temp file as original file */
        rename("replace.tmp", path);

        printf("\nSuccessfully replaced all occurrences of '%s' with '%s'.\n", oldWord, newWord);

    }
}
void replace_with_backup(char* OldWord,char* NewWord)
{


printf("b\n");
    char filename[100];
    int j=0;
    FILE *fptr1, *fptr2;
    //int k=num_files;
    printf("%d\n",num_files);
    while(num_files)
    {
        printf("Enter the filename to open for writing %s\n",buffer[j]);
        scanf("%s", filename);
        fptr1= fopen(buffer[j], "r");
        if (fptr1 == NULL)
        {
            printf("Cannot open file %s \n", filename);
            exit(0);
        }
        // Open another file for writing
        fptr2 = fopen(filename, "w");
        if (fptr2 == NULL)
        {
            printf("Cannot open file %s \n", filename);
            exit(0);
        }
        c = fgetc(fptr1);
        while (c != EOF)
        {
            fputc(c, fptr2);
            c = fgetc(fptr1);
        }
        printf("\nContents copied to %s\n", filename);
        j++;
        num_files--;
    }
    fclose(fptr1);
    fclose(fptr2);
    replace_j(OldWord,NewWord);
}

функция замены прекрасно работает с аргументами:
а заменить я его ... file1.txt file2.txt file3.txt
но при использовании его с функцией резервного копирования он заменяет только последний файл

Что я уже пробовал:

Я попытался отследить и проверить каждую функцию по отдельности и все работает нормально но с комбинацией этих двух есть проблема

1 Ответов

Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали электронное письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а он удваивает его и печатает ответ, то если ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!