C 程序 - 文件处理限制

标签 c

我正在尝试制作一个记录系统,我想在其中登录,使用我的员工 ID 和密码登录,或者如果可能的话,仅使用员工 ID 登录。问题是,每当我将雇主 ID 放入文本文件中时,我的代码都会限制我仅使用代码中预定义的用户名。如何使文本文件中的每个雇主 ID 都被接受并可以成功登录?

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

    void mainMenu();
    void EnterItem();
    void ViewItem();
    void SearchItem();
    void Exit();

    int count=1,ulength,plength;
    char username[]="Admin",password[]="1234";
    char name1[10],pass[10];

    char code[20],name[20],search[20];
    int price,qty;
     main(){

     printf("\nEnter USer ID And Password below(You have Only Three Chances!\nPress Enter To Continue" );
      getch();
      while(count<=3)
      {

      printf("\nENter User ID:");
      scanf("%s",name1);
      printf("\nENter Password:");
      scanf("%s",pass);
      ulength=strcmp(name1,username);
      plength=strcmp(pass,password);
      if(ulength==0&&plength==0)
      {
      printf("\nWelcome %s",name1);
      break;
      }
      else
      {
      printf("\nUsername And Password is Invalid!\n You Have %d more Chances/s.",3-count);
      }
      getch();
      count++;
      }
      if(count==4)
      printf("Maximum of three(3)Try only!");
      getch();




        mainMenu();
        EnterItem();
        ViewItem();
        SearchItem();
        Exit();
         getch();
         }

    void mainMenu(void){

    char choice;
    printf("\t*************************************\n");
    printf("\t******========================*******\n");
    printf("\t******==!!INVENTORY SYSTEM!!==*******\n");
    printf("\t******========================*******\n");
    printf("\t*************************************\n");
    printf("\n");

    printf("\nMenu:\n[a]EnterItem\n[b]ViewItem\n[c]SearchItem\n[d]Exit\n");
    printf("What do you want to perform?:");
    fflush(stdin);

    scanf("%c",choice);
    switch(choice){

    case 'a':
        EnterItem();
        break;
    case 'b':
        ViewItem();
        break;
    case 'c':
           SearchItem();
        break;
    case 'd':
        Exit();

        break;
    default:
        printf("Invalid Choice");

        }
    }

    void EnterItem(void){

    FILE *MyFile;
    char opt;
    do{
        printf("Enter Item Code:");
        fflush(stdin);
        scanf("%s",code);

        printf("Enter Item Name:");
        fflush(stdin);
        scanf("%s",name);


        printf("Enter Item Price:");
        fflush(stdin);
        scanf("%i",&price);


        printf("Enter Item Quantity:");
        fflush(stdin);
        scanf("%i",&qty);
            MyFile=fopen("MyFiles.txt","a+");
            fprintf(MyFile,"%s\t%s\t%i\t%i\n",code,name,price,qty);
            printf("Item Saved!!\n");

        printf("Do you want to Add More?:[y/n]");
        fflush(stdin);
        scanf("%c",&opt);


    }while(opt=='Y'||opt=='y');
    printf("Do you want to Go Back To main?:[y/n]");
    fflush(stdin);
    scanf("%c",&opt);
    if(opt=='y'||opt=='Y')
    mainMenu();
    else
       printf("Invalid Choice!!");

         }

    void ViewItem(void){

    FILE *MyFile;
    int c;

    if((MyFile=fopen("MyFiles.txt","r"))==NULL)
    {
    printf("Error Reading File!!");

    }
    while((c=fgetc(MyFile))!=EOF)
    printf("%c",c);
    printf("Go to Main Menu[y/n]:");
    fflush(stdin);
    scanf("%c",opt);
    if(opt=='y'||opt=='Y')
    mainMenu();
    else(); 
    fclose(MyFile);
    getch();
    }

    void SearchItem(void){

    FILE *MyFile;

        MyFile=fopen("MyFiles.txt","a+");
        printf("Enter the Item Code to Search:");
        fflush(stdin);
        scanf("%s",search);
        while(!feof(MyFile))
        {
        fscanf(MyFile,"%s %s %i %i",code,name,price,qty);
            if(strcmp(search,code)==0)
            {
            printf("Item Code: %s\n",code);
            printf("Item Name: %s\n",name);
            printf("Item Price: %i\n",price);
            printf("Item Quantity: %i\n",qty);
            break;
            printf("Go Back To main Menu[y/n]:");
            fflush(stdin);
            scanf("%s",opt);
    if(opt=='y'||opt=='Y')
    mainMenu();
    else
            }
           }
              fclose(MyFile);
    }

    void Exit(void){
    getch();
    }

最佳答案

ulength=strcmp(name1,用户名); plength=strcmp(pass,密码);

这限制了您在代码中仅使用预定义用户名的能力。您正在将其与包含“Admin”的用户名进行比较。因此,无论您输入什么作为用户名,您总是会将其与字符串“Admin”进行比较。

您需要做的是使用“fopen”打开包含员工详细信息的文件。然后您可以使用“fgets”将员工详细信息读取到数组(或您选择的其他数据结构)中。您可以迭代该列表并将其与“name1”进行比较。

干杯, 虚拟网络

附注使用 strncmp 因为它使您的代码更安全。如果您在 UNIX 机器上工作,除了其他标准 C 函数之外,您还会找到“fopen”、“fgets”和“strncmp”的手册页。

关于C 程序 - 文件处理限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12908093/

相关文章:

c - 如何以 root 身份以非交互方式运行 exec() 函数?

c - 如何在 C 程序中将俄语字符串作为命令行参数处理

c - 如何交替交换大写和小写?

c - wav 文件的值

c - ip地址全为零的inet_pton

c - 通过 Sublime Text 输出 C/关闭命令控制台

c++ - OpenSSL 和信号

c - APU 上的 OpenCL 是否能够使用整个内存?

c - 为什么这个 C 程序不能正常工作?

c - "blocking system call"是什么意思?