2013-02-24 2 views
1
void replaceString(char* file, char* str, char* replace) 
    { 
     FILE* fp = fopen(file,"rt"); 
     char buffer[BUFFER]; 
     while(fgets(buffer,BUFFER,fp)!=NULL) 
     { 
      char* s; 
      s=strstr(buffer,str); 
      if(s!=NULL) 
      { 
       strcpy(s,replace); 
       printf("%s is replaced by %s\n",str,replace); 
      } 
     } 
     fclose(fp); 
    } 
int main(int argc, char **argv) 
{ 
    char* file= "text.txt"; 
    replaceString(file,"is","was"); 
    printFile(file); 
    return 0; 
} 

Ребята Я новичок в работе с файлами, пытаясь найти и заменить строку другим. пожалуйста помоги! Я пытаюсь открыть файл в режиме «rt». Видел это в некотором примере кода. Не уверен в этом режиме. Я предполагаю, что мне нужно использовать файл temp.txt для этого! Можно ли это сделать в одном файле без использования какого-либо другого файла?Попытка найти и заменить строку из файла в C

+2

Только в том случае, если замена имеет ту же длину, что и заменяемая строка. И вам нужно будет прочитать «fseek» и «fwrite». –

+0

Может ли кто-нибудь предоставить исходный код для этого? –

+6

Принцип SO заключается в том, что вы задаете вопросы, на которые можно дать разумный ответ, и которые могут помочь другим. «Можете ли вы предоставить исходный код для этого?» в каком-то смысле очень легко: «Да, я могу, но я не буду!» - но это не очень полезно для других! –

ответ

0

"rt" режим предназначен для только для чтения. Используйте режим "r+". Это открывает файл для чтения и записи.

0

Я бы посмотрел на использование буфера и работу над этим.

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

int main () { 
    char buff[BUFSIZ];  // the input line 
    char newbuff[BUFSIZ]; // the results of any editing 
    char findme[] = "hello"; 
    char replacewith[] = "world"; 
    FILE *in, *out; 

    in = fopen("file.txt", "r"); 
    out= fopen("new.txt", "w"); 

    while (fgets(buff, BUFSIZ, in) != NULL) { 
     if (strstr(buff, findme) != NULL) { 
      // do 1 or more replacements 
      // the result should be placed in newbuff 
      // just watch you dont overflow newbuff... 
     } else { 
      // nothing to do - the input line is the output line 
      strcpy(newbuff, buff); 
     } 
     fputs(newbuff, out); 
    } 

    fclose(in); 
    fclose(out); 
    return 0; 
} 
+0

Что делать, если между буферами появляется 'findme'? Тогда вы пропустите его ... – rabensky

2

Вот некоторые из ошибок в вашем алгоритме.

  • Читает и посмотреть на один BUFFER символьных в то время, без перекрытия. Что делать, если между буферами появляется str? (то есть первая часть str находится в конце буфера, а вторая часть находится в начале следующего буфера).

  • Вы пытаетесь переписать str с помощью replace непосредственно в буфер, используя strcpy. Что делать, если обе строки имеют разную длину? Если replace короче str, вы все равно есть конец str там, и если replace больше, он перепишет текст после str

  • Даже если они имеют одинаковую длину, strcpy добавляет окончательный 0 символ в конец копии (вот как они говорят вам, где закончилась строка). вы НЕ ОПРЕДЕЛЕННО не хотите этого. Может быть, strncpy - лучшее предложение здесь, хотя оно все равно не будет работать, если обе строки имеют одинаковую длину.

  • Вы заменяете строки в буфере, но ничего не делаете с «исправленным» буфером! Буфер не является файлом, содержимое файла было COPIED в буфер. Таким образом, вы изменили копию, а затем ничего. Файл не изменится. Вам нужно записать свои изменения в файл, желательно другой.

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

Проделав то заменить в одном файле легко, если у вас достаточно памяти, чтобы сразу прочитать весь файл (если BUFFER больше, чем размер файла), но очень сложно, если не особенно в вашем случае, когда replace длиннее str.

1

Этот код заменяет все вхождения текста «orig». Вы можете внести поправку в соответствии с вашими нуждами:

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

static void 
replaceAllString(char *buf, const char *orig, const char *replace) 
{ 
    int olen, rlen; 
    char *s, *d; 
    char *tmpbuf; 

    if (!buf || !*buf || !orig || !*orig || !replace) 
     return; 

    tmpbuf = malloc(strlen(buf) + 1); 
    if (tmpbuf == NULL) 
     return; 


    olen = strlen(orig); 
    rlen = strlen(replace); 

    s = buf; 
    d = tmpbuf; 

    while (*s) { 
     if (strncmp(s, orig, olen) == 0) { 
      strcpy(d, replace); 
      s += olen; 
      d += rlen; 
     } 
     else 
      *d++ = *s++; 
    } 

    *d = '\0'; 

    strcpy(buf, tmpbuf); 
    free(tmpbuf); 
} 

int 
main(int argc, char **argv) 
{ 
    char str[] = "malatya istanbul madrid newyork"; 

    replaceString(str, "malatya", "ankara"); 
    printf("%s\n", str); 
    replaceString(str, "madrid", "tokyo"); 
    printf("%s\n", str); 

    return 0; 
}