gpt4 book ai didi

c - 如何删除包含用户在文件中提供的字符串的整行

转载 作者:行者123 更新时间:2023-11-30 19:25:17 24 4
gpt4 key购买 nike

i need to remove the whole line containing the string a user inserted,i'm having a hard time figuring out how i can delete this line here's is what i tied so far.



例如如果 u.txt 包含:
1 Hello World
2 你在哪里
* 用户输入:你*
u.txt 现在包含
1. Hello World
    #include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *tr1, *tr2;
char *p;
char chr;
char scanner [10];
int t = 1;
int sc;
tr1 = fopen("u.txt", "r");
chr = getc(tr1);
while (chr != EOF)
{
printf("%c", chr);
chr = getc(tr1);
}
printf("input your word to search:");
scanf("%s",scanner);
rewind(tr1);
tr2 = fopen("replica.txt", "w");
chr = 'A';

while (chr != EOF)
{
//expect the line to be deleted
sc= strstr(chr,scanner);
if (!sc)
{
//copy all lines in file replica.txt
putc(chr, tr2);
}

fclose(tr1);
fclose(tr2);
remove("u.txt");
rename("replica.txt", "u.txt");
tr1 = fopen("u.txt", "r");
chr = getc(tr1);
while (chr != EOF)
{
printf("%c", chr);
chr = getc(tr1);
}
fclose(tr1);
return 0;
}

最佳答案

通过使用带有 fgetc() 的面向字符的输入,您正在使自己变得困难。需要面向行的输入和输出的操作。此外,在您的方法中,您将删除文件中包含 you 的单词的每一行。是一个包含较少的子字符串,例如:

  • “你”、“你的”、“你是”、“你自己”、“你已经”等...

  • 为了确保您不删除行,除非它们包含单词 "you" ,您可以简单地检查以确保单词前后的字符是空格。您可以使用 isspace() ctype.h 中提供的宏以简化检查。

    当您遇到面向行的问题时,请使用面向行的输入和输出函数,例如 fgets()或 POSIX getline()用于输入和 puts()fputs()用于输出。唯一需要注意的是,面向行的输入函数读取并包含尾随 '\n'在他们填充的缓冲区中。只需在必要时通过覆盖尾随 '\n' 来删除带有 nul 终止字符 '\0' (或简单地说 0 )。

    使用面向行的方法将大大简化您的任务,并提供一种方便的方式,将您保留的行写入到输出文件中,而不是逐个字符地循环。使用面向字符的方法并没有错,而且它本身并不比面向行的方法慢——它只是不太方便。使工具与工作相匹配。

    以下示例为 "u.txt"并写 "v.txt"删除不需要的行,同时保留该单词是所搜索单词的包含较少的子字符串的行。 ( rename()remove() 留给您,因为您现有代码的那部分没有问题)

    简单地使用足够大小的固定缓冲区是进行面向行输入的最简单方法。您通常会知道最大的预期行是什么,只需使用足以处理它的缓冲区(不要吝啬!)。大多数行的长度不超过 80-120 个字符。一个 1024 个字符的固定数组绰绰有余。只需声明一个数组用作缓冲区来保存读取的每一行,例如:
    #define MAXW   32       /* max chars in word to find */
    #define MAXC 1024 /* max chars for input buffer */

    int main (int argc, char **argv) {

    char buf[MAXC], /* buffer to hold each line */
    word[MAXW]; /* user input to find/delete line */
    size_t wordlen = 0; /* length of user input */
    FILE *ifp, *ofp; /* infile & outfile pointers */

    您可以验证是否在命令行上为输入和输出文件名提供了足够的参数,然后打开并验证您的每个文件,例如
        if (argc < 3) { /* validate at least 2 program arguments given */
    printf ("usage: %s infile outfile\n", strrchr (argv[0], '/') + 1);
    return 1;
    }

    if (!(ifp = fopen (argv[1], "r"))) { /* open/validate open for reading */
    perror ("fopen-ifp");
    return 1;
    }

    if (!(ofp = fopen (argv[2], "w"))) { /* open/validate open for writing */
    perror ("fopen-ofp");
    return 1;
    }

    现在只需从用户那里获取输入并删除尾随 '\n' .使用 strcspn您可以在覆盖尾随 '\n' 的同时获得用户输入的长度在一次通话中。见: man 3 strspn ,例如
        fputs ("enter word to find: ", stdout); /* prompt for input */
    fflush (stdout); /* optional (but recommended) */

    if (!fgets (word, MAXW, stdin)) { /* read/validate word to find */
    fputs ("(user canceled input)\n", stdout);
    return 1;
    }

    /* get wordlen, trim trailing \n from find */
    word[(wordlen = strcspn (word, "\n"))] = 0;

    现在只需一次读取一行并搜索 word在行内并验证它是一个完整的单词,而不是一个更大的单词的一部分。写出所有不包含 word 的行单独到您的输出文件:
        while (fgets (buf, MAXC, ifp)) {    /* read each line */
    char *p = strstr (buf, word); /* search for word */
    if (!p || /* word not in line */
    (p != buf && !isspace (*(p - 1))) || /* text before */
    (!isspace (p[wordlen]) && p[wordlen] != 0)) /* text after */
    fputs (buf, ofp); /* write line to output file */
    }

    ( 注意: isspace() 宏用于检查字符是否为空白,在标题 ctype.h 中提供)

    关闭这两个文件,除了你的 remove()rename()你完成了。但是, 注意 您应该始终验证 fclose()在写入之后,以确保您捕获与关闭时刷新文件流相关的任何错误,否则这些错误不会通过单独验证每个写入来捕获,例如
        if (fclose (ofp) == EOF) {      /* validate EVERY close-after-write */
    perror ("fclose-ofp");
    remove (argv[2]);
    }

    fclose (ifp); /* close input file */
    }

    添加所需的头文件,您就有了一个工作示例。您可以将示例按如下方式使用:

    示例输入文件
    $ cat dat/u.txt
    hello world
    how are you
    show yourself
    you're missing

    使用示例
    $ ./bin/filermline dat/u.txt dat/v.txt
    enter word to find: you

    结果输出文件
    $ cat dat/v.txt
    hello world
    show yourself
    you're missing

    查看所有内容并将面向行的方法与您对 fgetc() 的面向字符的使用进行比较.如果您还有其他问题,请告诉我。

    关于c - 如何删除包含用户在文件中提供的字符串的整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59111502/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com