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 ファイルを使用する必要があると思います! 他のファイルを使用せずに、単一のファイルで実行できますか?

4

4 に答える 4

2

アルゴリズムのエラーの一部を次に示します。

  • 重複することなく、一度に 1 つの BUFFER の文字を読み取って調べます。strバッファ間に表示される場合はどうなりますか? (つまり、 の最初の部分はstrバッファーの末尾にあり、2 番目の部分は次のバッファーの先頭にあります)。

  • strを使用してバッファ内でreplace直接上書きしようとしていますstrcpy。両方の文字列の長さが異なる場合はどうなりますか? replaceが より短い場合はstr、まだそこに終わりがあり、 が長いstr場合replaceは、次のテキストを上書きしますstr

  • それらが同じ長さであってもstrcpy、コピーの最後に最後の 0 文字を追加します (これにより、文字列がどこで終了したかがわかります)。あなたは絶対にそれを望んでいません。strncpy両方の文字列が同じ長さでない場合は機能しませんが、ここではより良い提案かもしれません。

  • バッファ内の文字列を置き換えますが、「修正された」バッファでは何もしません! バッファはファイルではありません。ファイルの内容がバッファにコピーされました。そのため、コピーを変更しても何も変更しませんでした。ファイルは変更されません。変更をファイル、できれば別のファイルに書き込む必要があります。

そのような置換を書くことは、あなたが思うほど簡単ではありません。私はあなたを助けようとするかもしれませんが、ファイルの操作を学ぼうとしているだけで、まだ文字列に完全に慣れていない場合は、少し頭が痛いかもしれません.

一度にファイル全体を読み取るのに十分なメモリがある場合 ( がファイル サイズよりも大きい場合)、単一のファイルで置換を行うのは簡単ですが、特にが より長いBUFFER場合ではない場合は非常に注意が必要です。replacestr

于 2013-07-25T05:57:32.870 に答える
2

このコードは、「元の」テキストのすべての出現を置き換えます。必要に応じて変更できます。

#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;
}
于 2013-11-14T07:30:00.147 に答える
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;
}
于 2013-07-25T05:39:31.477 に答える
0

"rt"モードは読み取り専用です。使用"r+"モード。これにより、読み取りと書き込みの両方でファイルが開きます。

于 2013-07-25T05:30:33.077 に答える