C 程序搜索文件并将某些单词打印到新文件中

C Program to search a file and print certain words into a new file

提问人:angel666 提问时间:11/12/2019 最后编辑:theduckangel666 更新时间:11/12/2019 访问量:1383

问:

所以我需要编写一个 C 程序:

  1. 要求用户输入名字的字母

  2. 打开包含 1200 个名称列表的文件

  3. 在文件中搜索以用户输入的字母开头的所有名称

  4. 将所有找到的名称写入根据输入的字母命名的新文件中(例如 aNames.txt)

这是我到目前为止所拥有的。我可以获取原始文件并将所有名称放在一个数组中,但是我被困在如何获取用户输入并让它搜索每个名称的第一个字母上。我应该改用二维数组吗?对不起,我是新来的,请帮忙!谢谢

#define SIZE 1200

int main()
{

FILE *filePtr;
int i = 0;
char arrChar[SIZE];
char name[20];
char letter;

printf("Enter letter to search names that start with it:");
scanf("%c", letter);

filePtr = fopen("names.txt", "r");
while(fscanf(filePtr, "%s", arrChar) != EOF)
C 数组 文件 搜索 EOF

评论

0赞 William Pursell 11/12/2019
你为什么要提示这个角色?将该值作为命令行参数。(想象一下,如果 grep 通过提示要搜索的模式来表现!
0赞 Paper-SSheets 11/12/2019
我稍后可能会更详细地研究这一点,但我希望如果你想写入一个新文件,你可以在命令行上通过将其“管道”到一个新文件中来执行此操作,而不是在 C 代码中执行。虽然您当然可以通过简单地打印它来在 C 代码中完成这一切。例如,一旦遍历文件中的每个单词,如果当前单词以用户输入的字符开头,只需 printf(“%s”, 单词) + 换行符(请记住,这是伪代码。然后,当您运行程序时,只需将其作为 .这是允许的吗?还是这一切都需要做./myprogram > aNames.txt
0赞 angel666 11/12/2019
所以是的,这一切都需要通过运行程序来完成。我只允许使用 C 而不是使用命令行。
0赞 user3629249 11/12/2019
请发布一个最小的可重现示例,以便我们可以重现问题并帮助您调试它。

答:

0赞 JR87 11/12/2019 #1
#include <stdio.h>

char getNxtPntdVal(FILE *fPntr) {
    char holder;
    holder = fgetc(fPntr);
    return holder;
}


void writeToFile(char c){
    FILE *fpt = fopen("/home/jrinder/CLionProjects/untitled17/namesOut.txt","a");
    fputc(c,fpt);
    fclose(fpt);
}

int main() {

    FILE *filePtr;

    char arrChar[1200];
    char name[20];
    char letter;
    char ch;
    char ch2;
    int charNum=0;
    filePtr = fopen("/home/jrinder/CLionProjects/untitled17/names.txt","r");
    printf("Letter:");
    letter=getchar();



    while((ch=fgetc(filePtr))!=EOF){
        if(ch==letter && charNum ==0) {
            ch2 = ch;
            while (ch2 != '\n') {
                printf("%c", ch2);
                writeToFile(ch2);
                ch2 = getNxtPntdVal(filePtr);
            }
            charNum=charNum+1;
            printf("\n");
            writeToFile('\n');

        } else if(ch=='\n') {
            charNum=0;
        }else{
            charNum=charNum+1;
        }


    }

}

评论

1赞 angel666 11/12/2019
这很有帮助,谢谢!看看我能做什么
1赞 Lily AB 11/12/2019
您好@JR87,即使正在搜索的名称不在名称的开头,当前的实现也不会打印名称。例如:如果名称是,字母是 ,则输出将显示 ,而不是完全忽略名称。letterMacbethccbeth
1赞 angel666 11/12/2019
正如刚才指出的,当我按原样运行它并输入 A 时,它会打印每个包含 A 的名称,即使它不是以 A 开头。例如,它打印 Casey 和 Asey。在打印名称后,它也只会永远打印这些问号。有什么想法吗?我正试图自己弄清楚:')
0赞 JR87 11/12/2019
很好,我正在我的个人笔记本电脑上工作。工作电脑上没有 C 编译器。更新的代码
0赞 JR87 11/12/2019
再次更新。没有复制粘贴并制作了 type-o。应该很好
0赞 dash-o 11/12/2019 #2

替代解决方案,使用字符串 IO (fscanf, fprintf) 而不是逐个字符 IO (getchar/putchar):

还要安排声明 - 如果可能的话,推迟到需要的时间点 + 与初始值相结合;

#define SIZE 1200

int main()
{
char letter;
printf("Enter letter to search names that start with it:");
scanf("%c", letter);

FILE *filePtr = fopen("names.txt", "r");
if ( !filePtr ) ... // error handling

char out_name[20] = "?Names.txt" ;
name[0] = letter ;
FILE *out = fopen(out_name, "w") ;
if ( !out ) ... // error handling

char arrChar[SIZE];
while(fscanf(filePtr, "%s", arrChar) != EOF)
   if ( arrChar[0] == letter ) fprintf(out, "%s\n", arrChar) ;
}
fclose(out) ;
fclose(filePtr) ;