【问题标题】:Error: Bad file descriptor, when open() a file错误:错误的文件描述符,当 open() 文件时
【发布时间】:2012-12-03 15:44:19
【问题描述】:

我想用用户输入的名称创建一个文件。

这是我的代码:

int function1(){

    char path[50];
    char choice_f;
    char choice_m;
    int flag;     <-- updated
    mode_t mode;

    printf("Filename : ");
    scanf("%s", path);
    //printf("%s", path);     <-- path can be shown
    printf("\n");

    printf("Desire flag : ");
    scanf("%c", &choice_f);                 <-- updated
    //printf("%s", path);     <-- path CANNOT be shown from here
    while (choice_f != '1' && choice_f != '2' && choice_f != '3'){
        printf("Invalid input! Flag: ");
        scanf("%c", &choice_f);             <-- updated
    }
    if (choice_f == '1')
        flag = O_RDONLY;                      <-- updated
    else if (choice_f == '2')
        flag = O_WRONLY;                      <-- updated
    else if (choice_f == '3')
        flag = O_RDWR;                    <-- updated

    printf("Desire mode : ");
    scanf("%c", &choice_m);                <-- updated
    while(choice_m != '1' && choice_m != '2' && choice_m != '3' && choice_m != '4'){
        printf("Invalid input! Mode: ");
        scanf("%c", &choice_m);                <-- updated
    }
    if (choice_m == '1')
        mode = S_IRWXU;
    else if (choice_m == '2')
        mode = S_IRWXG;
    else if (choice_m == '3')
        mode = S_IRWXO;
    else if (choice_m == '4')
        mode = S_IRWXU | S_IRWXG | S_IRWXO;


    int fd = open(path, (int)flag|O_EXCL|O_CREAT);
    fchmod(fd, mode);
    printf("%d", fd);
    if (fd == -1){
        perror("error");
        return 1;
    }else
        printf("File \'%s\' Created \n", path);
    if (close(fd)<0)
        perror("close()");
    return 0;
}

但在程序结束时,我收到错误消息:

Error: Bad file descriptor

我多次测试path,似乎在第二个scanf() 之后,path 无法显示。即使我尝试将path 分配给另一个变量,它仍然是一样的。

我应该怎么做才能解决这个错误?

【问题讨论】:

  • 哇!您只需将字符串转换为 int ! “(int)flag”显然非常非常糟糕。我不希望open 用这样的垃圾输入做你想做的事。之后 fd 将变为 -1。
  • scanf("%s", &amp;choice_f) 正在破坏您的堆栈 - 您正在将字符串读入单个字符变量。
  • 老实说,这是我朋友做的代码,我正在做另一部分,现在我正在组合所有功能。所以,当我尝试将它与其他功能结合时出现错误,但在我结合它之前它是有效的。代码相同,但出现错误。
  • 对于未来的问题,请仅提供您的问题的最小示例。在这种情况下,所有这些多行打印语句使代码更难阅读,实际上只是噪音。
  • @l4mpi,在我之前的帖子中,我发布了主要问题,并简化了代码,这完全没有在我的代码中使用,只是概念,我得到的东西被批评为糟糕的设计。跨度>

标签: c ubuntu-11.04


【解决方案1】:

我不确定这是否是唯一的问题,但您设置的choice_f 和choice_m 不正确,应该是

scanf("%c", &choice_f);
scanf("%c", &choice_m);

相反。即您应该改用%c 格式说明符。如果您使用%s,将写入一个 nul 终止符(至少);您尚未为此提供存储空间,因此其他堆栈变量将被覆盖。

之后,按照 Nicholas Wilson 的建议,您应该将 flags 更改为 int 而不是 char*(并删除分配给 O_RDONLY 等的引号)

【讨论】:

  • 但我尝试将open() 调用更改为open("test", (int)flag|O_EXCL|O_CREAT);,并且它适用于choice_fchoice_m。但是当我将它改回 "test"path 时,它不再工作了。
  • 我认为可能是choice_f 的scanf 覆盖了路径的内存。 path 的第一个 char 可以设置为您请求复制到单个 char 的 char 数组中的 nul 终止符。您可以尝试更改choice_* 格式说明符,看看是否有帮助?
  • @AnonyNewbie 查看我的答案的更新或 Nicholas Wilson 对您的问题的评论,以了解代码中的另一个错误。
  • 我将flags 更改为int,将O_RDONLY 的分配不带引号,并将scanf() 更改为sprintf(),如上所述,它显示了此错误warning: format not a string literal and no format arguments
  • @AnonyNewbie 我不确定你的意思。您可以发布产生该错误的第一行吗?
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多