免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xiaodongma
打印 上一主题 下一主题

stat求文件长度结果不正确 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-03-14 15:24 |只看该作者
原帖由 isnowran 于 2007-3-14 15:07 发表
习惯归习惯,但还是先帮小弟把问题的本质弄清楚,在什么情况下会产生上述问题?


偶同问!!!

论坛徽章:
0
12 [报告]
发表于 2007-03-14 18:01 |只看该作者
为什么我没有问题呢?(晕倒,居然写错了)
Fedora core 4

[ 本帖最后由 soul_of_moon 于 2007-3-14 18:19 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2007-03-14 18:19 |只看该作者
请贴出你们的代码以及目标文件的大小,谢谢

论坛徽章:
0
14 [报告]
发表于 2007-03-14 18:36 |只看该作者
原帖由 isnowran 于 2007-3-14 18:19 发表
请贴出你们的代码以及目标文件的大小,谢谢

明天我到ubuntu上再试试

论坛徽章:
0
15 [报告]
发表于 2007-03-14 18:55 |只看该作者
ls -lsk file

论坛徽章:
0
16 [报告]
发表于 2007-03-14 21:28 |只看该作者
原帖由 chunyv 于 2007-3-14 14:23 发表

调用前都清零   使用完了之后再清一下    不管是windows下还是其它的
养个好习惯  不会吃亏的。。


不分青红皂白地就对结构体数据清零,这绝对不是一个好的习惯,也是程序员不自信的表现。甚至有时候可能会掩盖了你程序中存在的某些缺陷。

需要对结构体对象清零的时候要清零,只需要改变其中的某些成员的时候就不要触及其它成员,不需要清零的时候就不要清零。总之:所有的操作应该都是必须的,不需要的操作就不要做。

比如用作 stat 函数的 struct stat 结构就没有必要清零(搂主说清零之后才得到正确结果只能说明程序的其它部分存在问题)。

评分

参与人数 1可用积分 +2 收起 理由
langue + 2 我很赞同

查看全部评分

论坛徽章:
0
17 [报告]
发表于 2007-03-14 21:33 |只看该作者
>> 一个库函数的正确性不应该依赖于调用者传入的参数。

其正确的前提是:除非对此参数没有什么特别的要求。其实很多函数对其参数是有要求的,比如要求指针参数不能为 NULL 等等。

评分

参与人数 1可用积分 +2 收起 理由
langue + 2 我很赞同

查看全部评分

论坛徽章:
0
18 [报告]
发表于 2007-03-15 09:42 |只看该作者
zhoudh@zhoudh-linux:~/Templates$ cat test.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

int main()
{
    struct stat info;

    memset(&info, 0, sizeof(struct stat));

    stat("./test.c", &info);

    printf("size: %d\n", info.st_size);

    return 0;
}

zhoudh@zhoudh-linux:~/Templates$ stat test.c
  File: `test.c'
  Size: 273             Blocks: 8          IO Block: 4096   regular file
Device: 303h/771d       Inode: 1230175     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  zhoudh)   Gid: ( 1000/  zhoudh)
Access: 2007-03-15 09:39:59.000000000 +0800
Modify: 2007-03-15 09:39:36.000000000 +0800
Change: 2007-03-15 09:39:37.000000000 +0800
zhoudh@zhoudh-linux:~/Templates$ ./test
size: 273
zhoudh@zhoudh-linux:~/Templates$ vi test.c
zhoudh@zhoudh-linux:~/Templates$ cat test.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

int main()
{
    struct stat info;

//    memset(&info, 0, sizeof(struct stat));

    stat("./test.c", &info);

    printf("size: %d\n", info.st_size);

    return 0;
}

zhoudh@zhoudh-linux:~/Templates$ gcc test.c -o test
zhoudh@zhoudh-linux:~/Templates$ stat test.c
  File: `test.c'
  Size: 275             Blocks: 8          IO Block: 4096   regular file
Device: 303h/771d       Inode: 1230176     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  zhoudh)   Gid: ( 1000/  zhoudh)
Access: 2007-03-15 09:42:33.000000000 +0800
Modify: 2007-03-15 09:40:30.000000000 +0800
Change: 2007-03-15 09:40:30.000000000 +0800
zhoudh@zhoudh-linux:~/Templates$ ./test
size: 275
zhoudh@zhoudh-linux:~/Templates$

论坛徽章:
0
19 [报告]
发表于 2007-03-15 09:54 |只看该作者
原帖由 whyglinux 于 2007-3-14 21:28 发表


不分青红皂白地就对结构体数据清零,这绝对不是一个好的习惯,也是程序员不自信的表现。甚至有时候可能会掩盖了你程序中存在的某些缺陷。

需要对结构体对象清零的时候要清零,只需要改变其中的某些成员的时 ...

我也感觉LZ的代码应该是别的地方出了问题,因为我在Fedora core 4和Unbutu上就没有碰到问题。很可能是指针没有申请空间,是野指针,被其它的操作覆盖了内容而导致错误。

论坛徽章:
0
20 [报告]
发表于 2007-03-15 10:06 |只看该作者
原帖由 whyglinux 于 2007-3-14 21:33 发表
>> 一个库函数的正确性不应该依赖于调用者传入的参数。

其正确的前提是:除非对此参数没有什么特别的要求。其实很多函数对其参数是有要求的,比如要求指针参数不能为 NULL 等等。

我以为全是斑竹的话,看得晕乎乎的(前后矛盾)。
一个函数使用正确与否,在于你是否按照它的说明去做(像没_r和有_r的函数),不然要说明干嘛!
顺便灌个水
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP