2012-04-26 11 views
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; 
} 

このコードは最初の単語を正しく置き換えますが、置換単語で上書きしたい単語が複数ある場合や、単語が単語のどこかに正しく表示されない場合は正しく表示されませんそれを変えて、それをRAMゴミ箱などに変えます。もし誰かが私にあなたに感謝の理由を導くことができたら、私は不思議でした。 あなたが4文字の単語があるとしましょう:: fseek (file, (-(long)len), SEEK_CUR);fputc(charray[k],file);が更新され、バック位置0(4-4)になりますが(あなたはかなりの数より多くの問題を持っていない場合)の言葉は同じ長さであると仮定すると、文字列をテキストに置き換えるC言語

+0

ご使用方法のメッセージが必要な使用法と一致していないではありません。 'Usage:%s search replace filename'のようなものでなければなりません。 –

+0

'%s 'に' fscanf() 'を使用すると、結果を出力にエコーするときに、入力ファイルのすべてのスペースを失うことになります。 (OTOH、文字列比較コードを単純化します) 'fseek()'ロジックはちょっと奇妙です。何かを印刷する前に、入ってくる文字列と一致する単語を比較してみてください。両者が等しい場合は、置換文字を出力してください。それ以外の場合は、受信した文字列を出力します。心配する 'fseek()'はありません。一つの 'fseek()'だけが必要です。 –

+0

さて、ファイルのテキストを3番目の単語に変更する必要があります。幸いなことに、変更する単語が同じサイズでなければなりません。 p.s. printステートメントはテストのためだけにあり、他のすべてが動作していることを確認しています。 – thekevshow

答えて

1

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 

EDIT 2:フラッシュの理由:4.5.9.2 ANSI C、C99 7.19で同様の段落から、あなたの仮定のファイル位置はすべて間違っ

EDITているので、この時点で、アルゴリズムは、もはや機能していません.5.3):

ファイルを更新モード(mode引数の2番目または3番目の文字として '+')で開くと、入力ストリームと出力ストリームの両方が関連ストリームで実行されます。ただし、fflush関数またはファイル位置指定関数(fseek、fsetpos、またはrewind)への呼び出しを介さずに出力に直接入力を続けることはできません。また、ファイルの配置を介することなく入力に出力が直接続くことはありません入力操作でファイルの終わりが検出されない限りすでにfseek関数を持っているの読み取りと書き込みの間

のでそれが問題

+0

良い点は、その1つを逃した – JeremyP

+0

修正のための推奨事項はありますか?これは必要な長さになります。 – thekevshow

+0

コードで編集しました。個人的には、同じ関数内の 'replaceWord'と' wordReplace'という2つの変数に混乱を招くという命名規則も再考します。変数名として 'string'を使うことも議論の余地があります。これは単なる演習かもしれませんが、数年後に再考する必要があるプロダクションコードにこれらを入れたいでしょうか? – msam

関連する問題