【问题标题】:C Program to search a file and print certain words into a new fileC程序搜索文件并将某些单词打印到新文件中
【发布时间】:2020-03-07 13:24:58
【问题描述】:

所以我需要编写一个 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 代码中进行。虽然您当然可以通过简单的打印在 C 代码中完成所有操作。例如,一旦您遍历文件中的每个单词,如果当前单词以用户输入的字符开头,只需 printf("%s", the word) + a new line(记住这是伪代码。然后, 运行程序时,以./myprogram > aNames.txt 运行即可。这是否允许?还是都需要这样做
  • 所以是的,这一切都需要通过运行程序来完成。我只允许使用 C 而不能使用命令行。
  • 为什么提示输入角色?将该值作为命令行参数。 (想象一下,如果 grep 的行为是提示寻找模式!)
  • 请发minimal reproducible example,以便我们重现问题并帮助您调试。

标签: c arrays file search eof


【解决方案1】:

替代解决方案,使用字符串 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) ;

【讨论】:

    【解决方案2】:
    #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;
            }
    
    
        }
    

    }

    【讨论】:

    • 这很有帮助,谢谢!看看我能做什么
    • 您好@JR87,即使正在搜索的letter 不在名称的开头,当前的实现也不会打印名称。例如:如果名称为Macbeth,字母为c,则输出将显示cbeth,而不是完全忽略名称。
    • 正如刚刚指出的那样,当我按原样运行并输入 A 时,它会打印每个包含 A 的名称,即使它不以 A 开头。例如,它会打印 Casey 和 Asey .它也只是在打印名称后永远打印这些问号。任何想法为什么?我正在尝试自己弄清楚:')
    • 好消息,我在我的个人笔记本电脑上一边工作一边这样做。工作 PC 上没有 C 编译器。更新代码
    • 再次更新。没有复制粘贴并做了一个type-o。应该不错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多