Как заменить символ в текстовом файле с помощью C?

#c #file #fopen

#c #файл #fopen

Вопрос:

Мне нужно прочитать текстовый файл (E3-5.txt ), и найдите символ c1, который будет заменен на c2. Это мой неполный код:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    char c;
    char c1 = 'm';
    char c2 = 'a';
    int i;
    FILE* fp;
    fp = fopen("C:\E3-5.txt", "r ");
    if (fp == NULL)
    {
        printf("File not found!");
        return 0;
    }
    for(c = getc(fp); c != EOF; c = getc(fp))
    {
        if(c == 'm')
        {
            i = ftell(fp);
            printf("nPosition %d", i);
        }

    }
}
 

У меня возникли проблемы с поиском позиции c1 в тексте и как ее переписать.
Редактировать:
Я использовал код из ответа, но он не изменил текст.
Это новый код:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    char c;
    char c1 = 'm';
    char c2 = 'a';
    int i;
    FILE* fp;
    fp = fopen("C:\E3-5.txt", "rb ");
    if (fp == NULL)
    {
        printf("File not found!");
        return 0;
    }
    else
    {
        for(c = getc(fp); c != EOF; c = fgetc(fp))
        {
            if(c == c1)
            {
                fseek(fp, -1, SEEK_CUR);
                fputc(c2, fp);
            }
            else
            {
                return 0;
            }
        }
    }
   return 0;
}
 

Программа вернула 0, ничего не написав в тексте

Комментарии:

1. поскольку окна открываются с rb

Ответ №1:

Здесь у вас очень наивный:

 int freplace(FILE *f, char needle, char repl)
{
    int result = 1;
    int c;
    if(f)
    {
        while((c = fgetc(f)) != EOF)
        {
            if(c == needle)
            {
                fseek(f, -1, SEEK_CUR);
                fputc(repl, f);
                //all I/O functions require error handling
            }
        }
    }
    return resu<
}
 

Комментарии:

1. Привет, я отредактировал вопрос.

Ответ №2:

getc() возвращает int значение, поэтому вам нужно объявить int c , что не char c проверять EOF.

ftell() возвращает местоположение. Используйте fwrite() или fputc() для записи в файл в этом месте, установив с fseek() помощью .

Перейдите к https://en.cppreference.com/w/c для справки. Многие новички не могут прочитать все стандартные библиотечные функции, а некоторые даже изобретают велосипед.

Комментарии:

1. Я не думаю, что это проблема, так как я использовал char c несколько раз в своем предыдущем коде, и он отлично работает.

2. Это злоупотребление неопределенным поведением.

3. @MariaMarchellaGandhi итак, вы много раз совершали одну и ту же ошибку в прошлом. Узнайте о неопределенном поведении.

Ответ №3:

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

 #include <stdio.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
    int c1 = argc > 1 ? argv[1][0] : 'm';
    int c2 = argc > 2 ? argv[2][0] : 'a';
    const char *path = argc > 3 ? argv[3] : "stdin";
    FILE *in = argc > 3 ? fopen(path, "r") : stdin;
    if( in == NULL ){
        perror(path);
        return 1;
    }
    FILE *out = stdout;
    char tmp[1024] = ".tmpXXXXX";
    char *outpath = "stdout";
    if( argc > 3 ){
        outpath = tmp;
        int fd = mkstemp(tmp);
        if( fd == -1 ){
            perror("mkstemp");
            return 1;
        }
        if( (out = fdopen(fd, "w")) == NULL ){
            perror(tmp);
            return 1;
        }
    }
    int c;
    while( (c = fgetc(in)) != EOF ){
        if( c == c1 ){
            c = c2;
        }
        if( fputc(c, out) == EOF ){
            perror(outpath);
            return 1;
        }
    }
    if( argc > 3 ){
        if( fclose(out) ){
            perror(outpath);
            return 1;
        }
        if( rename(outpath, path) ){
            perror(path);
            return 1;
        }
    }
    return 0;
}
 

Ответ №4:

Замена строки

Просто для полноты картины, вот немного кода для замены слова в файле! Это заменит один символ, поэтому, конечно, он отвечает на вопрос и показывает несколько полезных примеров.

Это также моя первая и единственная нетривиальная золотая программа, написанная в мае 1994 года! Хотя вы, конечно, можете придраться к нему, он работал так, как задумано, и мои коллеги и я использовали его по-разному для задач, связанных с системным администратором. Скомпилирован на MS C / C

 #include <stdio.h>
#include <string.h>

#define err(e) {_fcloseall(); fprintf(stderr,        
           "USAGE: chg source dest oldstr newstrn%sn",e); exit(1);}

main (int argc,char *argv[])
{
    FILE *in,*out;
    char buffer[200];
    char *old,*new;
    int i,j,k;


    if (argc!=5)
        err("invalid # of parameters");
    if ((in=fopen(argv[1],"r"))==NULL)
        err("Can't open source");
    if ((out=fopen(argv[2],"w"))==NULL)
        err("Can't open dest");
    old=argv[3];
    new=argv[4];
    if (*old=='"')
        old  ;
    if (*new=='"')
        new  ;
    if (i=strlen(old) amp;amp; old[i-1]=='"')
        old[i-1]=0;
    if (i=strlen(new) amp;amp; new[i-1]=='"')
        new[i-1]=0;
    if (!*old)
        err("Can't search for nothing!");
    if (!*new)
        err("Can't replace nothing!");
    j=0;
    while (!feof(in))
    {
        if ((buffer[j]=fgetc(in))==EOF)
            break;
        buffer[j 1]=0;
        j  ;
        if (!old[j-1])
        {
            fprintf(out,new);
            fputc(buffer[j-1],out);
            j=0;
        }
        else if (_strnicmp(buffer,old,j))
        {
            fprintf(out,buffer);
            j=0;
        }
        else if (j>195)
            err("Internal error, buffer filled past 195");
    }
}