Как заменять символы в текстовых файлах?

Я хочу реализовать программу, которая заменяла бы все происшествия буквы за одним * в текстовом файле.

Это мой код:

void sust_a(){
    FILE *arch;
    arch=fopen("D:/Progra1/ejercicio8.txt","r+");
    char car;
    while (fscanf(arch,"%c",&car)!=EOF)
    {
        if (car=='a'){
            //fprintf(arch,"a");
            //fputs("*",arch);
            fseek(arch,0,SEEK_SET);
            fprintf(arch,"*");
            fputs("*",arch);
        }
    }
    fclose(arch);
}
void main()
{
    sust_a();
}

В моем блокноте замечаний я имею сохраняемый: aaaaaaaaaa

и когда он работает, он возвращает меня: aaaa**aaaa
(когда я использую fseek, но когда я использую fprintf(...) он ничего не реализует)

Как он мог бы упорядочивать это?

2
задан 07.11.2016, 10:24
2 ответа

я не имею составителя C по отношению к руке как чтобы это тестировать, но почти уверен, что твоя проблема находится в fseek. Когда ты используешь функцию fread, "file пойнтер" двигается автоматически в следующее положение, так что не необходимо, чтобы ты использовал функцию fseek.

Этот код был бы должен функционировать:

void sust_a(void)
{
    FILE *arch;
    char car; 
    arch=fopen("D:/Progra1/ejercicio8.txt","r+");

    while (fscanf(arch,"%c",&car)!=EOF)
    {
        if (car=='a')
        {
            fprintf(arch,"*");    
        }
    }
    fclose(arch);
}

Кроме того, аргумент SEEK_SET говорит ему в функцию fseek, чтобы он привел в пример начало файла, в твоем случае ты говоришь ему, чтобы двинули 0 положений с начала, следовательно он писал бы всегда о первом характере.

Правильное использование функции fseek в этом случае, он состоял в том, чтобы использовать аргумент SEEK_CUR, для того, чтобы file пойнтер двинул 0 положений с места, где он является помещенным в настоящее время.

Я надеюсь, что он подает тебя, привет.

1
ответ дан 24.11.2019, 12:43
  • 1
    большое спасибо:), но все же оно я не функционирует... –  valeria 07.11.2016, 07:15

Следующий cГіdigo создал deberГ, - чтобы функционировать:

void sust_a(void)
{
    FILE *arch;
    char car; 
    arch=fopen("D:/Progra1/ejercicio8.txt","r+");
    if (!arch){
            perror("El archivo no se pudo abrir\n");
            return;
    }

    while (fscanf(arch,"%c",&car)!=EOF)
    {
        if (car=='a')
        {
            fseek(arch, -1, SEEK_CUR);
            fputc('*', arch);
            fflush(arch);
        }
    }
    fclose(arch);
}

Как только leГ-ste характер, который ты хочешь заменить, быть должным возвращаться для posicionearte на этом же самом характере, но чтобы писать, тогда ты пишешь характер (заменяя ее 'в' из-за '*'). Ты должен заканчиваться с fflush, помни, что ты должен отлаживать буфер чтения (внутренний буфер библиотеки libc), так как произошла одна modificaciГіn в файле (с fputc). вызов в fputc двигает курсор в следующую posiciГіn, следовательно не необходимо двигать это с fseek. Я надеюсь, что это решает твою проблему.

1
ответ дан 24.11.2019, 12:43