免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2971 | 回复: 16
打印 上一主题 下一主题

read/write的弱问题: [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-05-02 10:59 |只看该作者 |倒序浏览
以下函数,一个是把域名、IP写入文件中,另一个是从文件中while读出来。

但是读出来永远是空的。我cat,文件是有内容。

这两函数,非常简单,请帮忙看一下,多谢!



  1. typedef struct StructDomain
  2. {
  3.     char domain[64];
  4.     char ip[64];
  5. }StructDomain;


  6. int AddRecord()
  7. {
  8.     StructDomain domain;
  9.     int fd;

  10.     printf("\nPlease input Domain: ");
  11.     fflush(NULL);
  12.     scanf("%s", domain.domain);
  13.     printf("Please input IP: ");
  14.     fflush(NULL);
  15.     scanf("%s", domain.ip);

  16.     fd = open(DAT_FILE, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
  17.     if (-1 == fd)
  18.     {
  19.         return 1;
  20.     }

  21.     lseek(fd, SEEK_END, 0);

  22.     if (sizeof(domain) != write(fd, &domain, sizeof(domain)))
  23.     {
  24.         return 1;
  25.     }

  26.      close(fd);

  27.      return 0;
  28. }

  29. int LstRecord()
  30. {
  31.     int fd;
  32.     StructDomain domain;

  33.     fd = open(DAT_FILE, O_RDONLY);
  34.     if (-1 == fd)
  35.     {
  36.         return 1;
  37.     }

  38.     while (sizeof(domain) == read(fd, &domain, sizeof(domain)))
  39.     {
  40.         printf("Domain:%s IP:%s\n", domain.domain, domain.ip);
  41.     }

  42.     close(fd);

  43.     return 0;
  44. }


复制代码

论坛徽章:
0
2 [报告]
发表于 2007-05-02 11:19 |只看该作者
干吗循环读啊,第一次读进去了,第2次读把第1次的内容冲掉了啊.
将while改为if吧

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2007-05-02 11:23 |只看该作者
原帖由 cheyo 于 2007-5-2 10:59 发表
以下函数,一个是把域名、IP写入文件中,另一个是从文件中while读出来。

但是读出来永远是空的。我cat,文件是有内容。

这两函数,非常简单,请帮忙看一下,多谢!


[code]
typedef struct StructDoma ...

如果方便的话给出完整的代码以及测试执行的结果。

论坛徽章:
0
4 [报告]
发表于 2007-05-02 11:28 |只看该作者
虽然第二次的内容会被冲掉,但不要紧,冲掉前我已经打印出来了。

但是:改为if还是不行。

论坛徽章:
0
5 [报告]
发表于 2007-05-02 11:42 |只看该作者

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>

  6. void ShowMenu();
  7. int AddRecord();
  8. int RmvRecord();
  9. int LstRecord();

  10. #define DAT_FILE ".DOMAIN_FILE"

  11. typedef struct StructDomain
  12. {
  13. //    int did;
  14.     char domain[64];
  15.     char ip[64];
  16. }StructDomain;

  17. int main(int argc, char ** argv)
  18. {
  19.     char key[128];

  20.     ShowMenu();

  21.     while (scanf("%s", key))
  22.     {
  23.         fflush(NULL);
  24.         //getchar();
  25.         switch(key[0])
  26.         {
  27.             case 'a':
  28.             case 'A':
  29.                 if (0 != AddRecord())
  30.                 {
  31.                     printf("Error occur.\n");
  32.                     return 1;
  33.                 }
  34.                 break;
  35.             case 'r':
  36.             case 'R':
  37.                 RmvRecord();
  38.                 break;
  39.             case 'l':
  40.             case 'L':
  41.                 LstRecord();
  42.                 break;
  43.             case 'x':
  44.             case 'X':
  45.                 return 0;
  46.             default:
  47.                 ShowMenu();
  48.         }
  49.         fflush(NULL);
  50.     }

  51.     return 0;
  52. }

  53. void ShowMenu()
  54. {
  55.     printf("\n");
  56.     printf("-----------------------------------------\n");
  57.     printf("--------- Domain Manage Tool ------------\n");
  58.     printf("    [a] Add Domain                       \n");
  59.     printf("    [r] Rmv Domain                       \n");
  60.     printf("    [l] Lst Domain                       \n");
  61.     printf("    [x] Exit                             \n");
  62.     printf("-----------------------------------------\n");
  63.     printf("choose: [x] ");
  64. }

  65. int AddRecord()
  66. {
  67.     StructDomain domain;
  68.     int fd;

  69.     printf("\nPlease input Domain: ");
  70.     fflush(NULL);
  71.     scanf("%s", domain.domain);
  72.     printf("Please input IP: ");
  73.     fflush(NULL);
  74.     scanf("%s", domain.ip);

  75.     fd = open(DAT_FILE, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
  76.     if (-1 == fd)
  77.     {
  78.         return 1;
  79.     }

  80.     lseek(fd, SEEK_END, 0);

  81.     if (sizeof(domain) != write(fd, &domain, sizeof(domain)))
  82.     {
  83.         return 1;
  84.     }

  85.     close(fd);

  86.     return 0;
  87. }

  88. int RmvRecord()
  89. {
  90.     printf("RmvRecord\n");
  91.     return 0;
  92. }

  93. int LstRecord()
  94. {
  95.     int fd;
  96.     StructDomain domain;

  97.     fd = open(DAT_FILE, O_RDONLY);
  98.     if (-1 == fd)
  99.     {
  100.         return 1;
  101.     }

  102.     while (sizeof(domain) == read(fd, &domain, sizeof(domain)))
  103.     {
  104.         printf("Domain:%s IP:%s\n", domain.domain, domain.ip);
  105.     }

  106.     close(fd);

  107.     return 0;
  108. }


复制代码


执行结果如下:

[cheyo@Fedora]$ ./domain

-----------------------------------------
--------- Domain Manage Tool ------------
    [a] Add Domain
    [r] Rmv Domain
    [l] Lst Domain
    [x] Exit
-----------------------------------------
choose: [x] a

Please input Domain: sina.com
Please input IP: 1.3.4.5
l
Domain: IP:
a

Please input Domain: cu.net
Please input IP: 3.4.5.5
l
Domain: IP:
x
[cheyo@Fedora]$




原帖由 MMMIX 于 2007-5-2 11:23 发表

如果方便的话给出完整的代码以及测试执行的结果。

论坛徽章:
0
6 [报告]
发表于 2007-05-02 11:51 |只看该作者
楼主的主要问题在这一句:
lseek(fd, SEEK_END, 0);

当lseek的第三个参数whence是0 (SEEK_SET)是,文件cursor会移动到第二个参数处,即2(SEEK_END),因此文件前面多写了2个byte的0。由于创建文件时本来就是文件首开始写入,不需要这句lseek。
另外楼主的那句while也有些问题。

论坛徽章:
0
7 [报告]
发表于 2007-05-02 11:57 |只看该作者
多谢!

原来是lseek两个参数搞乱了.  应该是: lseek(fd, 0, SEEK_END); 不是 lseek(fd, SEEK_END, 0);

请问一下,我的while有什么问题?

[ 本帖最后由 cheyo 于 2007-5-2 11:59 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-05-02 12:02 |只看该作者
哈哈,楼主又转到CU来问了啊~~

论坛徽章:
0
9 [报告]
发表于 2007-05-02 12:04 |只看该作者
原帖由 cheyo 于 2007-5-1 19:57 发表
多谢!

原来是lseek两个参数搞乱了.  应该是: lseek(fd, 0, SEEK_END); 不是 lseek(fd, SEEK_END, 0);

请问一下,我的while有什么问题?


本来以为你只打印一个记录,不过看了你后面的代码,知道你要打印所有的记录,那while应该没什么问题。

论坛徽章:
0
10 [报告]
发表于 2007-05-02 12:06 |只看该作者
原帖由 cheyo 于 2007-5-1 19:57 发表
多谢!

原来是lseek两个参数搞乱了.  应该是: lseek(fd, 0, SEEK_END); 不是 lseek(fd, SEEK_END, 0);

请问一下,我的while有什么问题?


另外,直接 O_APPEND追加模式打开这个文件岂不方便一些,不用每次seek到最后了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP