使用open读取仅带有值的文本文件,然后尝试锁定该文件

时间:2018-07-26 15:03:24

标签: c linux posix

我有一个文件文本文件,例如“〜/ MA14.txt”,其值只有0或1。我需要使用“系统调用”打开打开文本文件,(最终将文件锁定,直到阅读为止)并检查如果值为0或1。我正在使用0的文件测试该功能。

问题是函数返回48(ascii值为零)而不是0。

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


int get_permission(char *file_path_name);

int main() {
    char cwd[1024];
    if (getcwd(cwd, sizeof(cwd)) != NULL)
        fprintf(stdout, "Current working dir: %s\n", cwd);
    else
        perror("getcwd() error");
    char str[80];
    strcpy(str, cwd);
    strcat(str, "/");
    strcat(str, "MA14");
    strcat(str, ".txt");
    printf("String obtained on concatenation: %s\n", str);
    int permission = get_permission(str);
    printf("permission is: %d\n", permission);
    return 0;
}


int get_permission(char *file_path_name){
    char c;
    size_t nbytes;
    nbytes = sizeof(c);
    int fd = open(file_path_name, O_RDONLY | O_EXCL);
    read(fd, &c, nbytes);
    printf("c = % d\n", c);
    close(fd);
    return c;
}

Current working dir: ~/cmake-build-debug
String obtained on concatenation: ~cmake-build-debug/MA14.txt
c =  48
permission is: 48

Process finished with exit code 0

2 个答案:

答案 0 :(得分:2)

您提供的代码有三个错误,因此您无法获得想要的结果。

第一个错误是在函数声明中,因为返回类型必须为char。

  

char get_permission(char *文件路径名);

第二个是在get_permission中打印c的值时,因为printf必须打印一个char [%c]而不是整数[%d]。

  

printf(“ c =%c \ n”,c);

第三个是主要功能,因为您必须了解我们上面所说的来调整类型。

  

int权限= get_permission(str);

     

printf(“权限为:%c \ n”,权限);

我重新发布了更正的代码。 我希望您觉得它有用。

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

char get_permission(char *file_path_name);

int main() {
    char cwd[1024];
    if (getcwd(cwd, sizeof(cwd)) != NULL)
        fprintf(stdout, "Current working dir: %s\n", cwd);
    else
        perror("getcwd() error");
    char str[80];
    strcpy(str, cwd);
    strcat(str, "/");
    strcat(str, "MA14");
    strcat(str, ".txt");
    printf("String obtained on concatenation: %s\n", str);
    int permission = get_permission(str);
    printf("permission is: %c\n", permission);
    return 0;
}

char get_permission(char *file_path_name){
    char c;
    size_t nbytes;
    nbytes = sizeof(c);
    int fd = open(file_path_name, O_RDONLY | O_EXCL);
    read(fd, &c, nbytes);
    printf("c = %c\n", c);
    close(fd);
    return c;
}

答案 1 :(得分:0)

您在评论中有2个选项,而我有第三个。选项是:

  1. 减去'0'以获得整数值。
  2. 返回c =='1'
  3. 首先将值存储为二进制:

    char c = 0; // Note this is the integer, not '0'
    write(fd, &c, 1);
    

我不建议第三种选择。对于似乎是用例的情况,通常的做法是将文件保留为文本格式(ASCII),以便您可以在文本编辑器中读取文件以进行故障排除。因此,请使用前两个选项之一。