1

我编写了一个程序来从文件中删除某个单词(作为用户输入)。我读了这个词,打开了我想删除这个词的文件,读取文件中的每一行并将其拆分为单词,然后将每个单词与我的关键字进行比较。如果它们不匹配,我将它们打印到一个临时文件中。

但是当我打开临时文件时,整个文本都被复制了。有人可以帮我吗????

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

main()
{
int i;
FILE *fp1,*fp2;
char key[1000],a[1000],temp[1000];

printf("\nEnter the word to be deleted from file : ");
scanf("%s",key);

fp1 = fopen("a.txt","r");
fp2 = fopen("b.txt","w");

while(fgets(a,1000,fp1))
{
    for(i=0;a[i]!='\0';++i)

        if(a[i]==' ')
            break;
        else            
            temp[i]=a[i];
    temp[i]='\0';
    if(strcmp(temp,key)!=0)
    {
        fputs(temp,fp2);
    }

    bzero(a,1000);
}

fclose(fp1);
fclose(fp2);

printf("\n\n");

/*remove("a.txt");
rename("b.txt","a.txt");*/

}
4

5 回答 5

1

又一个解决方案。它有一些上面提到的相同问题,例如单词的边界与英语语法不匹配。在某些情况下,它还具有比严格必要的复制更多的效率低下。

但是,我更喜欢这个版本而不是你的版本,因为它抽象了单词删除任务,而不是与其余代码内联。加上它工作得更好。

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

void remove_str2(char* buffer, char* find, int lfind) {
  char* paste = strstr(buffer, find);
  if (!paste) { return; }
  char* start = paste + lfind;

  while (1) {
    char* end = strstr(start, find);
    if (!end) {
      end = start + strlen(start) + 1;
    }
    memmove(paste, start, end - start);

    paste += end - start;
    start = strstr(end, find);
    if (!start) { return; }
    start += lfind;
  }
}

void remove_str(char* buffer, char* find, int lfind) {
  char* p = strstr(buffer, find);
  if (p) {
    remove_str(p + lfind, find, lfind);
    // shift everything left
    do { *p = *(p + lfind); } while (*(++p));
  }
}

int main() {
  FILE *fp1, *fp2;
  char key[1000], a[1000];

  // require key to be preceeded by a space
  key[0] = ' ';

  printf("\nEnter the word to be deleted from file : ");
  scanf("%s", &key[1]);

  fp1 = fopen("a.txt","r");
  fp2 = fopen("b.txt","w");

  while (fgets(a, 1000, fp1)) {
    remove_str(a, key, strlen(key));
    fputs(a, fp2);
  }

  fclose(fp1);
  fclose(fp2);

  printf("\n\n");

  return 0;
}
于 2013-10-09T17:13:53.143 回答
0

问题的一部分是,一旦你找到一个空格,你就处理这个词,但你没有完成处理该行的其余部分。在 fputs 之后,您转到循环的顶部并阅读另一行。当我编译并运行您的代码段时,它确实会输出每行的第一个单词,只要它不是选定的单词。

此外,在输出单词时,它们之间不输出任何空格,并且行尾没有回车。因此,所有不匹配的单词都在一行上连续输出。

以下代码段修复了更多问题(还有一些我没有解决的剩余问题 - 例如,如果行上没有尾随空格,则不会输出行上的最后一个不匹配的单词。您可以通过寻找 '\0' 和空间来解决这个问题。我没有这样做,因为它需要更改循环结构以在看到 '\0' 时不退出,这样你就有机会测试它):

    while(fgets(a,1000,fp1))
    {
        int j = 0;
        for(i=0;a[i]!='\0';++i)

            if((a[i]==' '){
             temp[j++]='\0';
             if(strcmp(temp,key)!=0) {
                fprintf (fp2, "%s ", temp);
                }
             j = 0;
            }
           else
             temp[j++]=a[i];
          fprintf (fp2, "\n");
    }
于 2013-10-09T16:41:33.053 回答
0

尝试编译它,它几乎可以正常工作,只是它没有在输出文件中插入空格;)

if(strcmp(temp,key)!=0)
{
    temp[i++] = ' ';
    temp[i] = '\0';
    fputs(temp,fp2);
}

此外,它的代码非常敏感。如果我有一行字,它就不起作用。如果您的测试文件在单词前有空格而您的关键字没有,则它不应该工作。

于 2013-10-09T16:44:53.690 回答
0

一些观察,

main()
{
    //you will need input index, output index
    int in, on; //in: input index, on: output index
    FILE *fp1,*fp2;
    char key[1000],iray[1000],oray[1000];
    char* here; //clarifies the comparison

    printf("\nEnter the word to be deleted from file : ");
    scanf("%s",key);
    printf("key: %s",key); fflush(stdout);

    if(!(fp1 = fopen("a.txt","r"))) { printf("open error\n"); exit(1); }
    if(!(fp2 = fopen("b.txt","w"))) { printf("open error\n"); exit(2); }

    while(fgets(iray,sizeof(iray),fp1))
    {
        printf("line: %s",iray); fflush(stdout);
        for(in=on=0; iray[in]; ++in) //'\0' = 0 = false //please indent
        {   //please use braces
            //printf("%d: %c\n",in,iray[in]); fflush(stdout);
            if(iray[in]==' ')
            {
                oray[on++] = iray[in];
                continue; //break gets you out of loop
            }
            here = &(iray[in]);
            //printf("here: %s\n",here); fflush(stdout);
            if( !strcmp(here,key) ) //have word?
            {
                in+=strlen(key); //skip word
                continue;
            }
            oray[on++] = iray[in];
        }
        oray[on] = '\0';
        printf("line: %s",oray); fflush(stdout);
        fputs(oray,fp2);
        iray[0]=0; //bzero(iray,1000);
        oray[0]=0; //bzero(oray,1000);
    }
    fclose(fp1);
}
于 2013-10-09T16:53:41.373 回答
0

编辑:一个完整​​的解决方案:这就是你的循环应该是这样的:

while(fgets(a,1000,fp1))
{
  int j=0;
  for(i=0;a[i]!='\0';++i)
  {
    if(a[i]==' ')
    {
       temp[j]=0;
       if(strcmp(temp,key)!=0)
       {
          fputs(temp,fp2);
       }
       j=0;
       //this should be after fputs if you want to remove the space after obsolete word. 
        fputs(" ",fp2);         
    }
    else            
       temp[j++]=a[i];          
  }
  //last word if there is no space after!
  if(strcmp(temp,key)!=0)
  {
    fputs(temp,fp2);
  }
  fputs("\n",fp2);
  a[0] = 0;
}
于 2013-10-09T17:02:39.417 回答