如何在C语言中使用断言与fopen?

问题描述 投票:0回答:1

我有一个任务,我需要你的建议

我运行我的程序时有参数,比如

./program.x input.txt output.txt

所以在我的程序中,我检查了我是否正确使用了参数。

    if (argc != 3) {                                
    printf("Wrong arguments number\n");
    printf("I should run this way:\n");
    printf("%s source result\n",argv[0]);
    exit(1);
    }

    if( (wz= fopen(argv[1],"r")) == NULL) {
        printf("Open error %s\n", argv[1]);
        exit(1);
    }

    if( (wc= fopen(argv[2],"w")) == NULL) {
        printf("Open error %s\n", argv[2]);
        exit(2);
    }

我也用assert检查文件是否正常,他们告诉我们也要用assert。

    assert((wz = fopen(argv[1] ,"r")));
    assert((wc = fopen(argv[2] ,"w")));

但我不知道应该先放 assert,还是先检查参数数?

    if (argc != 3) {                                
    printf("Wrong arguments number\n");
    printf("I should run this way:\n");
    printf("%s source result\n",argv[0]);
    exit(1);
    }

    if( (wz= fopen(argv[1],"r")) == NULL) {
        printf("Open error %s\n", argv[1]);
        exit(1);
    }

    if( (wc= fopen(argv[2],"w")) == NULL) {
        printf("Open error %s\n", argv[2]);
        exit(2);
    }
    assert((wz = fopen(argv[1] ,"r")));
    assert((wc = fopen(argv[2] ,"w")));

还是

    if (argc != 3) {                                
    printf("Wrong arguments number\n");
    printf("I should run this way:\n");
    printf("%s source result\n",argv[0]);
    exit(1);
    }

    if( (wz= fopen(argv[1],"r")) == NULL) {
        printf("Open error %s\n", argv[1]);
        exit(1);
    }

    if( (wc= fopen(argv[2],"w")) == NULL) {
        printf("Open error %s\n", argv[2]);
        exit(2);
    }
    assert((wz = fopen(argv[1] ,"r")));
    assert((wc = fopen(argv[2] ,"w")));
    if (argc != 3) {                                
    printf("Wrong arguments number\n");
    printf("I should run this way:\n");
    printf("%s source result\n",argv[0]);
    exit(1);
    }

    if( (wz= fopen(argv[1],"r")) == NULL) {
        printf("Open error %s\n", argv[1]);
        exit(1);
    }

    if( (wc= fopen(argv[2],"w")) == NULL) {
        printf("Open error %s\n", argv[2]);
        exit(2);
    }
c fopen assert
1个回答
1
投票

assert(expression) 是一个宏定义的 #include <assert.h>.

如果 NDEBUG 宏之前定义了 #include <assert.h> 行,然后调用宏 assert(expression) 扩充为无效表达式 ((void)0). 否则,它将向标准错误流写入一个错误信息,并调用 abort().

因为 assert(expression) 可能不会产生任何代码,如果是在 expression 有任何副作用。副作用的一个例子是给一个变量(或其他lvalue)赋值。另一个副作用的例子是打开文件。调用 assert((wz = fopen(argv[1] ,"r"))); 做到了这两点。正确的方法是使用 assert 在这种情况下,是做执行操作之前的。assert 呼叫,只用 assert 来检查结果。例如

wz = fopen(argv[1], "r");
assert(wz != NULL);

表达式 wz != NULL 没有副作用(假设 wz 未申报的 volatile 类型限定符),所以是安全的。


OP使用的是 assert 作为练习的一部分。 应当指出的是 assert 通常只用于检查那些预计不会失败的事情,它写入标准错误流的消息是为了帮助开发者发现代码中的错误。然而,调用 fopen 在命令行参数上是很有可能失败的,通常应该以对命令行参数有用的方式来处理。用户 的程序,而不是开发者。

© www.soinside.com 2019 - 2024. All rights reserved.