0

我有这个 C 代码,我遇到的问题是我找不到我想要的记录,使用文件处理它总是说找不到结果。使我的系统清晰运行并显示记录的正确方法是什么?

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdbool.h>
    #include <stdlib.h>
    #include <windows.h>


    void loadMenu();
    void addEmployee();
    void searchEmployee();
    bool found = false;
    int choice;

    FILE*myrec;

    char Name[20],Age[20],IDnum[20],search[20];

    void loadMenu(){
    printf("[1]Add Employee\t[2]Search Employee\t[3]Exit\nChoice:");
    scanf("%d", &choice);
    }


    void addEmployee (){
    char ans;
    do{
    printf("Enter IDnumber:");
    fflush(stdin);
    gets(IDnum);
    printf("Enter Name:");
    fflush(stdin);
    gets(Name);
    printf("Enter Age:");
    fflush(stdin);
    gets(Age);

    myrec = fopen ("record.txt","a+");
    fprintf(myrec,"%s \t %s \t %s \n ",Name,Age,IDnum);
    printf("Record Saved !");
    printf("Do you want to add another record ? Y/N");
    scanf("%s",&ans);
    fclose(myrec);
    }
    while (ans=='Y'||ans=='y');
    }


    void searchEmployee(){

    myrec = fopen("record.txt","a+");
    printf("Enter Employee IDnumber:");
    scanf("%s",&search);
    while(!feof(myrec)){
    fscanf(myrec,"%s %s %s",IDnum,Name,Age);
    if (strcmp(search,IDnum)==0){
    printf("IDnum: %s\n", IDnum);
    printf("Name: %s\n",Name);
    printf("Age :%s\n",Age);
    found = true;
    break;

    }

    }
    if(!found) printf("No results.");
    fclose (myrec);
    }


    int main(){
    bool repeat = false;
    do{
    loadMenu();
    switch(choice){

    case 1:
    addEmployee();
    break;

    case 2:
    searchEmployee();
    break;

    case 3:
    repeat = true;
    break;
    }
    }while(!repeat);

    getch();
    }

我的代码有什么问题?

4

2 回答 2

0

我看到几个错误:

  1. 缓冲区溢出

    字符答案;

    scanf("%s",&ans); // 如果输入 'Y' 则至少写入 2 个字符,'Y' 和 '\0'

使用更大的 ans 缓冲区:char ans[10];

然后 scanf("%s", ans);

  1. 指向指针的指针

    字符搜索[20];// search 是一个指向缓冲区的指针

    scanf("%s",&search); // 你应该使用 scanf("%s", search);

于 2012-09-14T11:49:10.260 回答
0

有很多错误。

几个快速的:

  1. feof() 在尝试阅读之前不要检查,那是无效的。事实上,永远不要使用feof(),除非您已经完成了失败的读取。
  2. "a+"如果您只想从文件中读取,请不要以附加 ( ) 模式打开。这种模式支持阅读,但还是很奇怪。
  3. 也许您应该尝试重新打开文件,而不是让它一直处于打开状态。
  4. 始终检查 I/O 函数的返回值,例如fscan(). 他们可能会失败。
于 2012-09-14T11:32:57.540 回答