Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-在文件处理中未找到记录_C - Fatal编程技术网

C-在文件处理中未找到记录

C-在文件处理中未找到记录,c,C,我有这个C代码,其中,我遇到的问题是,我无法找到我想要的记录,使用文件处理它总是说没有找到结果。什么是使我的系统清晰工作并显示记录的正确方法 #include <stdio.h> #include <conio.h> #include <string.h> #include <stdbool.h> #include <stdlib.h> #include <windows.h>

我有这个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();
    }
#包括
#包括
#包括
#包括
#包括
#包括
void loadMenu();
无效雇主();
作废雇员();
bool-found=false;
智力选择;
文件*myrec;
字符名[20],年龄[20],IDnum[20],搜索[20];
void loadMenu(){
printf(“[1]添加员工\t[2]搜索员工\t[3]退出\n选择:”);
scanf(“%d”,选择(&C);
}
无效雇主(){
查尔安斯;
做{
printf(“输入IDnumber:”);
fflush(stdin);
获取(IDnum);
printf(“输入名称:”);
fflush(stdin);
获取(名称);
printf(“输入年龄:”);
fflush(stdin);
获得(年龄);
myrec=fopen(“record.txt”,“a+”);
fprintf(myrec,“%s\t%s\t%s\n”,名称、年龄、IDnum);
printf(“记录已保存!”);
printf(“是否要添加其他记录?是/否”);
scanf(“%s”、&ans);
fclose(myrec);
}
而(ans=='Y'| ans=='Y');
}
void searchEmployee(){
myrec=fopen(“record.txt”,“a+”);
printf(“输入员工ID号:”);
scanf(“%s”,搜索(&s);
而(!feof(myrec)){
fscanf(myrec,“%s%s%s”,IDnum,Name,Age);
if(strcmp(search,IDnum)==0){
printf(“IDnum:%s\n”,IDnum);
printf(“名称:%s\n”,名称);
printf(“年龄:%s\n”,年龄);
发现=真;
打破
}
}
如果(!find)printf(“无结果”);
fclose(myrec);
}
int main(){
布尔重复=假;
做{
loadMenu();
开关(选择){
案例1:
addEmployee();
打破
案例2:
searchEmployee();
打破
案例3:
重复=正确;
打破
}
}而(!重复);
getch();
}
我的代码怎么了?

有很多错误

一些简单的例子:

  • 在尝试读取之前不要选中feof(),这是无效的。事实上,永远不要使用feof(),除非您已经进行了失败的读取
  • 如果您只想读取文件,请不要在附加(
    “a+”
    )模式下打开。此模式支持读取,但仍然很奇怪
  • 也许您应该尝试重新打开文件,而不是保持打开状态
  • 始终检查I/O函数的返回值,如
    fscan()
    。他们可能会失败
  • 我看到几个错误:

  • 缓冲区溢出

    查尔安斯

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

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

    然后是scanf(“%s”,ans)

  • 指针到指针

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

    scanf(“%s”,&search);//您应该使用scanf(“%s”,搜索)


  • 永远不要打电话给fflush(stdin)-这是UB-见男人。另外,请正确格式化您的代码。比较
    scanf(“%s”,&search)
    vs
    fscanf(myrec,“%s%s%s”,IDnum,Name,Age)
    。其中一个不会按您的预期编写结果。如何使用更好的语法修复代码?@PaulR-如何使用更好的语法公式?:(对于第一个:char ans[50];scanf(“%s”,ans);