Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中使用带fopen的assert?_C_Fopen_Assert - Fatal编程技术网

如何在C中使用带fopen的assert?

如何在C中使用带fopen的assert?,c,fopen,assert,C,Fopen,Assert,我有一个任务,我需要你的建议 我用参数运行我的程序,比如 ./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"

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

我用参数运行我的程序,比如

./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")));

assertexpression是由include定义的宏

如果在include行之前定义了NDEBUG宏,则宏调用assertexpression将扩展为void表达式void0。否则,它将向标准错误流写入错误消息并调用abort

因为assertexpression可能不会生成任何代码,所以如果表达式有任何副作用,就不应该调用它。副作用的一个例子是给变量或其他左值赋值。另一个副作用示例是打开文件。调用assertwz=fopenargv[1],r;这两件事都做。在这种情况下,使用assert的正确方法是在assert调用之前执行操作,并且只使用assert检查结果。例如:

wz = fopen(argv[1], "r");
assert(wz != NULL);
表达式wz!=如果wz未使用volatile类型限定符声明,则NULL没有副作用,因此是安全的


OP正在使用断言作为练习的一部分。应该注意的是,assert通常仅用于检查预期不会失败的内容,它写入标准错误流的消息旨在帮助开发人员发现代码中的错误。但是,在命令行参数上调用fopen很可能失败,通常应以对程序用户有用的方式处理,而不是对开发人员有用的方式处理。

不要将assert与fopen一起使用。不应使用任何有副作用的表达式调用assert,因为如果定义了NDEBUG宏,它根本不会生成任何代码。通常断言用于调试生成,所以在实际程序中不应将它们用于流控制。。。这是一个可以打破的传统,因为它需要使用宏NDEBUG编译发布版本。。。但是,它们被有条件地忽略这一事实意味着您不应该将它们用于业务逻辑,它会在将来的某个地方咬到您。
wz = fopen(argv[1], "r");
assert(wz != NULL);