首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序在打开文件后挂起打开和fdopen。

程序在打开文件后挂起打开和fdopen。
EN

Stack Overflow用户
提问于 2016-11-02 08:09:32
回答 2查看 1.8K关注 0票数 4

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

现在,每当我使用fgets()fgetc()fp之类的函数时,程序就挂在我的终端上。我没有收到编译器警告。有什么想法吗?

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 08:13:20

表达式

代码语言:javascript
复制
file_descriptor = open(argv[1], O_RDWR) == -1

不像您期望的那样工作,因为相等运算符==比赋值运算符具有更高的http://en.cppreference.com/w/c/language/operator_precedence。这意味着这个表达式更像是

代码语言:javascript
复制
file_descriptor = (open(argv[1], O_RDWR) == -1)

这意味着您的file_descriptor将是01,这取决于比较的方式。

您需要在任务分配中使用括号:

代码语言:javascript
复制
(file_descriptor = open(argv[1], O_RDWR)) == -1
票数 13
EN

Stack Overflow用户

发布于 2016-11-02 08:18:34

添加到另一个答案。它是“挂起”的,因为bug导致它实际读取标准输入(文件描述符0)。试着输入一些东西,它就会读出来。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40375096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档