用open和fdopen打开文件后程序挂起

Ins*_*ane 4 c

我使用的是open()O_RDWR,然后使用描述符fdopen()"r+".我检查文件是否首先存在access(),并检查open()返回-1然后检查该FILE *fp集合fdopen()不是NULL.

现在,每当我使用任何功能,如fgets()fgetc()fp该程序挂在我的终端.我没有编译器警告.有任何想法吗?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv) {
    char buffer[512];
    int file_descriptor;
    FILE *file;

    if (argc != 2) {
        puts("ERROR: Missing argument");
        exit(0);
    }
    else if (access(argv[1], F_OK) == -1) { // Check if file exists
        puts("ERROR: File does not exist");
        exit(0);
    } else if (file_descriptor = open(argv[1], O_RDWR) == -1) { // Check for open() failure
        puts("ERROR: Unable to open file using open()");
        exit(0);
    }

    file = fdopen(file_descriptor, "r+"); // Use descriptor

    if (file == NULL) {
        puts("ERROR: Unable to open file using fdopen()");
        fclose(file);
        exit(0);
    }

    // fscanf(file, "%c", stdout); // Hangs
    // fgets(buffer, sizeof(buffer), file); // Hangs
    printf("%c", fgetc(file)); // Hangs

    fclose(file);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 13

表达方式

file_descriptor = open(argv[1], O_RDWR) == -1
Run Code Online (Sandbox Code Playgroud)

因为你希望它是不行的,因为平等运营商==有更高的优先级比赋值运算符.这意味着表达更像

file_descriptor = (open(argv[1], O_RDWR) == -1)
Run Code Online (Sandbox Code Playgroud)

这意味着你file_descriptor将是0或将1取决于比较的方式.

您需要使用括号进行分配:

(file_descriptor = open(argv[1], O_RDWR)) == -1
Run Code Online (Sandbox Code Playgroud)


mkj*_*mkj 6

添加到其他答案.它是"挂起",因为该错误导致它实际上读取标准输入(文件描述符0).尝试输入内容,它会读取它.

  • 请将此答案视为评论,因为它不是已发布答案的解决方案或增强功能. (2认同)