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

int main ( int argc, char *argv[] )
{
    if ( argc != 4 ) /* argc should be 4 for correct execution */
    {
        /* Print argv[0] assuming it is the program name */
        printf( "usage: %s filename\n", argv[0] );
    }
    else 
    {
        // We assume argv[1] is a filename to open
        char* wordReplace = argv[1];
        char* replaceWord = argv[2]; 
        FILE *file = fopen( argv[3], "r+" );
        /* fopen returns 0, the NULL pointer, on failure */
        if ( file == 0 )
        {
            printf( "Could not open file\n" );
        }
        else 
        {
            char string[100];
            int len = 0;int count = 0;int i = 0;int k = 0;
            while  ( (fscanf( file, "%s", string ) ) != EOF )
            {
                len = strlen(string);
                count++;
                char charray[len+1];
                if(count == 1)
                {
                    for (i = 0; i < len; i++)
                    {
                        charray[i] = replaceWord[i];
                        printf("%c\n", charray[i]);
                    }
                }
                //printf("%c\n", charray[0]);
                printf( "%s\n", string );
                if(strcmp(string, wordReplace) == 0)
                {
                    for(k = 0; k < strlen(replaceWord); k++)
                    {
                         fseek (file, (-(long)len), SEEK_CUR);
                         fputc(charray[k],file);
                         //replaceWord++;
                    }
                    //strcpy(string, replaceWord);
                    //fprintf(file,"%s",replaceWord);
                    //fputs(string, file);
                    //printf("\n%d\n", len);
                }       
            }
            fclose( file );
        }
    }
    printf("\n");
    return 0;
}

このコードは現在、最初の単語を適切に置き換える際に機能しますが、置換単語で上書きしたい単語が複数ある場合、または単語がテキストの別の場所に表示されている場合、適切に変更されず、ラムのゴミ箱などに変更されます。 . 誰かが私を感謝の理由に導くことができるかどうか興味がありました.

4

1 に答える 1

1

単語が同じ長さであると仮定します (そうでない場合、さらに多くの問題があります): 4 文字の単語があるとします: fseek (file, (-(long)len), SEEK_CUR);は位置 0 (4-4) にfputc(charray[k],file);戻り、位置 1 に更新され、次に 4 に戻ります。以上はエラーですが、 fseek からの戻り値をチェックしていないため、これはわかりません。この時点で、想定されたファイルの位置がすべて間違っているため、アルゴリズムは機能しなくなりました

編集:

if(strcmp(string, wordReplace) == 0)
{
    fseek (file, (-(long)len), SEEK_CUR);
    for(k = 0; k < strlen(replaceWord); k++)
    {                         
        fputc(charray[k],file);
    }

} 
fflush(file); //you need to flush the file since you are switching from write to read

編集 2: フラッシュの理由: 4.5.9.2 ANSI C から、C99 7.19.5.3 の同様の段落:

ファイルが更新モード (mode 引数の 2 番目または 3 番目の文字として「+」) で開かれると、関連付けられたストリームで入力と出力の両方が実行される場合があります。ただし、fflush 関数またはファイル配置関数 ( fseek 、 fsetpos 、または rewind ) への呼び出しが介在しない限り、出力の直後に入力が続くことはありません。入力操作がファイルの終わりに達しない限り、機能します。

読み取りと書き込みの間にはすでに fseek があるため、問題はありません

于 2012-04-26T15:22:58.060 に答える