Member 12957547 Ответов: 2

Как я могу заменить первое появление слова в файле?


Я пытаюсь заменить первое появление слова в файле, но другие файлы из argv не заменяются. Вот моя функция:
void replace_first(char* oldWord,char* newWord)
{
    printf("f\n");
    FILE * fPtr;
    FILE * fTemp;
    FILE* f;
    char path[1000];
    char file[BUFFER_SIZE];
    char buff[BUFFER_SIZE];
    char buff_2[BUFFER_SIZE];
    printf("%d\n",num_files);
 //   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 in main files");
        }
        fTemp = fopen("replace_4.txt", "w");
        if(fTemp == NULL)
        {
            perror("error in replace file");
        }


        /* 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);
        }



     while ((fgets(buff, BUFFER_SIZE, fPtr)) != NULL)
     {

        printf("beforeeeee %s\n",buff);
        char *pos,temp[BUFFER_SIZE];
        int index = 0;
        int owlen;
        owlen = strlen(oldWord);
        while ((pos = strstr(buff, oldWord)) != NULL)
        {
            first_flag=1;
            // Bakup current line
            strcpy(temp, buff);

            // Index of current found word
            index = pos - buff;

            // Terminate str after word found index
            buff[index] = '\0';

            // Concatenate str with new word
            strcat(buff, newWord);

            // Concatenate str with remaining words after
            // oldword found index.
            strcat(buff, temp + index + owlen);
            printf("TTTTTTTTTTTT %s\n",buff);
            fputs(buff, fTemp);
        }

        if(first_flag==1)
        {

            first_flag=0;
            break;
        }
       // printf("Afteeeeeeeeeeer %s\n",buff);

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


        /* Delete original source file */
       int del = remove(path);
       if (!del)
       {
            printf("The file is Deleted successfully\n");
       }
       else
       {
            printf("the file is not Deleted\n");
            perror("error in deleting file ");
       }


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

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

    }

}

а командная строка, с которой я выполняю это:

main replace -f  I hoda  -- file1.txt file2.txt


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

Я старался не ставить взлома
if(first_flag==1)
        {

            first_flag=0;
            break;
        }

но другого пути я не нахожу.

2 Ответов

Рейтинг:
2

Richard MacCutchan

Вы читаете список имен файлов из files_to_be_scanned.txt, и для каждого имени в этом списке вы копируете его в replace_4.txt, с любыми возможными изменениями. Поэтому вы даже не смотрите на имена файлов в командной строке.

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


Рейтинг:
0

OriginalGriff

Когда вы опубликовали это вчера: Не удается заменить слово в файле с помощью языка Си[^]
Я сказал вам, что вам нужно использовать отладчик, чтобы понять, что делает ваш код, и из этого вы должны быть в состоянии понять, что вам нужно изменить: это не меняется, потому что сегодня пятница, а не четверг!

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


Maciej Los

О, да!