佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1133|回复: 8

怎样 compare data from file with the data key-in by user??

[复制链接]
发表于 4-8-2011 05:42 PM | 显示全部楼层 |阅读模式
本帖最后由 无知小子92 于 4-8-2011 05:47 PM 编辑

如题:
小弟现在在做着大学的assignment,问题是要 create 一个 library system

大致上都应该还 OK,但是我面对最大的问题是......如下
我要把 user key-in 的 id 与 saved file 里的 id compare... 如果不符合,show error(表示user log-in id not found)
可是,问题来了,我就是做不到这点

以下是小弟的 coding,请问谁可以帮忙看看哪里出了问题呢?
谢谢!


  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. int main (void)
  5. {
  6.     int login;
  7.     char lib_id[10], lib_pass[10], name[10], std_id[10], std_pass[10];
  8.     FILE* lib_data;

  9.     do
  10.     {
  11.         printf("Welcome to Library Systems\n\n");
  12.         printf("Please choose your login\n");
  13.         printf("\t1: Librarian\n");
  14.         printf("\t2: Student\n\n");

  15.         fflush(stdin);
  16.         printf("Login as: ");
  17.         scanf("%d", &login);

  18.         if(login != 1 && login != 2)
  19.         {
  20.             printf("error\n\n");
  21.             system("pause");
  22.             system("cls");
  23.         }

  24.     }while(login != 1 && login != 2);


  25.     if(login == 1)
  26.     {
  27.         system("cls");

  28.         printf("\t\t\tYou are current login as librarian.\n\n");
  29.         printf("Enter your ID: ");
  30.         scanf("%s", &lib_id);
  31.         printf("Enter your password: ");
  32.         scanf("%s", &lib_pass);

  33.         lib_data = fopen("Librarian_ID.txt", "r");

  34.         if(!lib_data)
  35.         {
  36.             printf("Could not open input file\a\n");
  37.         }

  38.         if(strcmp(lib_id, fgets(name,10, lib_data)) == 0 && strcmp(lib_pass, fgets(name,10, lib_data)) == 0))
  39.         {
  40.             printf("What you want to do next??");
  41.             printf("1.\tadd book\n");
  42.             printf("2.\tcheck out book\n");
  43.         }
  44.         else
  45.         {
  46.             printf("error");
  47.         }

  48.         fclose(lib_data);
  49.     }

  50.     return 0;

  51. }
复制代码


从 line 49 到 line 58,不管我 key-in 的 ID 对与否,IF-ELSE selection 都起不了作用,什么问题呢?

谢谢!
回复

使用道具 举报


ADVERTISEMENT

发表于 4-8-2011 09:06 PM | 显示全部楼层

  1. if(login != 1 && login != 2)
复制代码
因该用 || 吧

  1. if(strcmp(lib_id, fgets(name,10, lib_data)) == 0 && strcmp(lib_pass, fgets(name,10, lib_data)) == 0))
  2.         {
  3.             printf("What you want to do next??");
  4.             printf("1.\tadd book\n");
  5.             printf("2.\tcheck out book\n");
  6.         }
  7.         else
  8.         {
  9.             printf("error");
  10.         }
复制代码
因该这里有问题
回复

使用道具 举报

 楼主| 发表于 4-8-2011 10:16 PM | 显示全部楼层
因该用 || 吧因该这里有问题
loonloon0625 发表于 4-8-2011 21:06
对啊~我也说明觉得是 从 line 49 到 line 58 有问题
请问你懂得如何解决吗?

谢谢
回复

使用道具 举报

发表于 4-8-2011 10:24 PM | 显示全部楼层
很久没写C 了,
(strcmp(lib_id, fgets(name,10, lib_data))
(strcmp(ib_pass, fgets(name,10, lib_data))

你好像 lib_id 和 name,10 compare 完, 之后又用回name,10 跟 lib_pass compare

你试试retrive之后,printf 出来看是什么data
回复

使用道具 举报

发表于 4-8-2011 10:32 PM | 显示全部楼层
本帖最后由 geekman 于 4-8-2011 10:35 PM 编辑
  1. if(strcmp(lib_id, fgets(name,10, lib_data)) == 0 && strcmp(lib_pass, fgets(name,10, lib_data)) == 0))
复制代码
Parentheses mismatch。'(' x5, ')' x6。。。

  1. int name_result, pass_result;
  2. 。。。
  3. fgets(name, 10, lib_data);
  4. name_result = strcmp(lib_id, name);
  5. fgets(name, 10, lib_data);
  6. pass_result = strcmp(lib_pass, name);
  7. if((name_result == 0) && (pass_result == 0))
  8. {
  9. ...
复制代码
看到你的错误在那里了吗?你的括弧的次序放错了,导致 == 和 && 的结果混乱而产生错误。别想着把几个步骤浓缩在一行里面,这不会让你的导师给你加分,也不会显得你很pandai,事实上大多数导师十分痛恨这种做法(我的亲身体验。。。被扣了10分呢)。将来如果你加入开发团体,你的这种恶习会让你被你的同事们打晕后架在BBQ炉上烤。。。

哦,对了,just a reminder, fgets读取的c string后面有个null terminator, so,你的name只能承载最大9个char的资料。如果你打算读取的是10个char。。。well, good luck。
回复

使用道具 举报

发表于 4-8-2011 10:39 PM | 显示全部楼层
回复 5# geekman


   是哦,我都没发觉到
回复

使用道具 举报

Follow Us
发表于 4-8-2011 10:45 PM | 显示全部楼层
回复 5# geekman


   又上了一堂
回复

使用道具 举报

 楼主| 发表于 5-8-2011 01:55 AM | 显示全部楼层
Parentheses mismatch。'(' x5, ')' x6。。。看到你的错误在那里了吗?你的括弧的次序放错了,导致 == 和  ...
geekman 发表于 4-8-2011 22:32


oh!! 原来是那个挂号的关系哦!谢谢阁下的指教!
其实我的目的不是什么要显得自己很 pandai,我只是想到program(logic)怎样 flow,就直接 type 进去吧了
好的!谢谢你的劝告!

OK,我知道 string 后面有个 NULL terminator(\0),谢谢提醒!


另外还有个小问题,
假设我的 lib_data.txt fie 里面有,
  1. lib1
  2. lib2
  3. lib3
复制代码

不管 user key-in 对与否,我的 program 一直都是 show false result de 哦(else part)

不过,假设我的 lib_data.txt fie 里面只有,
  1. lib1
复制代码

这样整个 program 的 logic 就正常回啦~

换句话说,只要 .txt file 里面多过一个 data,就是 false 了
反之,如果只有一个 data。对就是对,错就是错
当然,一间library不可能只有一位librarian

我想问,是什么问题呢?
我的 data 在 .txt file 排法有错?

再次感激指教!
回复

使用道具 举报


ADVERTISEMENT

发表于 5-8-2011 08:45 AM | 显示全部楼层
本帖最后由 geekman 于 5-8-2011 09:06 AM 编辑

试试看把name[10]改成name[100], 然后把fgets()的result print出来, 看看是不是因为new line character 的处理方式不对造成读取的资料超过一行。直接检测读取和对比的资料是最直接的debug方法。甚至你不只是要print string,还得print ASCII code,以便检测是否是control character (line feed, new line)在搞鬼。用code break + add watch会比较方便啦。

另外,你上面的code显示的是你连续读取同样的file两次,第一次compare with lib_id,第二次compare with lib_pass。。。但是你的data全都是lib_id?

还有,你如何handle multiple user id check? User输入lib1, 可是你的data file里面有lib1\nlib2\nlib3,so, 你如何检测用户输入lib3的id是正确的?

最后,你用scanf来读取用户输入,scanf会ignore new line character(\n), 但是fgets却会保留\n。。。我觉得统一用scanf和fscanf会比较好。

以上论点纯为猜测,毕竟我已经有近10年没写Console program,stdio里的东西都几乎忘光了 加上手头上没有C compiler(现在改用C#了), 所以也无法验证你的coding,只能靠你自己去验证了。

p/s: 如果是我,我会用structure来保存用户id和密码,同时使用同样的structure来读取和写入资料:

  1. struct user_struct
  2. {
  3.    char user_id[11]; //assume 10 char id
  4.    char user_pass[11];
  5. };

  6. user_struct user_input, file_data;

  7. //user input:
  8. scanf("%s", user_input.user_id);
  9. scanf("%s", user_input.user_pass);
  10. ...
  11. //reading file:
  12. FILE *file = fopen("data.dat", "r"); //binary mode for reading
  13. fread(file_data, sizeof(user_struct), 1, file);
  14. ...
  15. //writing file:
  16. FILE *file = fopen("data.dat", "wb"); //binary write, or use "ab" for binary append, depend on your own usage
  17. fseek(file, 0l, SEEK_END); //go to end of file if you r not using append mode
  18. fwrite(user_input, sizeof(user_struct), 1, file);
  19. ...
  20. //compare:
  21. strcmp(user_input.user_id, file_data.user_id);
  22. strcmp(user_input.user_pass, file_data.user_pass);
复制代码
郑重声明 :以上代码不保证100%正确,毕竟这只是根据10年前的模糊记忆写出来的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT


本周最热论坛帖子本周最热论坛帖子

ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 11-11-2025 09:20 AM , Processed in 0.090967 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表