使用系统调用从文件读取变量的值

时间:2020-08-26 16:27:56

标签: c token system-calls

我想打开一个名为config.txt的文件,并从中读取一些变量的值。

文件具有以下格式:

K 10
C 5
E 20

变量的顺序可以更改。 我想使用打开,读取,关闭系统调用来提取值并将它们存储到相应的变量中。

我已经写的是:

#define _POSIX_C_SOURCE  200112L

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define PRINTUSAGE(x)                                           \
    {                                                               \
        fprintf(stderr, "use: %s config.txt\n", x);         \
        return EXIT_FAILURE;                                        \
    }

#define CHECK_EQ(name, X, val, str, ...)        \
        if ((X)==(val)) {                           \
            perror(#name);                          \
            int errno_copy = errno;                 \
            print_error(str, __VA_ARGS__);          \
            exit(errno_copy);                       \
        }

void print_error(const char *str, ...){
    const char err[]="ERROR: ";
    va_list argp;
    char * p=(char *)malloc(strlen(str)+strlen(err)+512);
    if (!p) {
        perror("malloc");
        fprintf(stderr,"FATAL ERROR nella funzione 'print_error'\n");
        return;
    }
    strcpy(p,err);
    strcpy(p+strlen(err), str);
    va_start(argp, str);
    vfprintf(stderr, p, argp);
    va_end(argp);
    free(p);
}

int main(int argc, char *argv[]){
    if(argc != 2)
        PRINTUSAGE(argv[0]);

    char *infile = argv[1];
    int fin, len;

    int K, C, E;

    CHECK_EQ(open, fin=open(infile, O_RDONLY), -1, "Opening file in input %s : errno=%d\n", infile, errno);

    //todo

    read_values(fin, *K, *C, *E);

    printf("K=%d C=%d E=%d\n", K, C, E);

    //endtodo

    CHECK_EQ(close, len=close(fin), -1, "Closing file in input %s : errno=%d\n", infile, errno);
    return 0;
}

int read_values(int fin, int *K, int *C, int *E){
    //todo
}       

如何实现该功能?

1 个答案:

答案 0 :(得分:0)

您的代码中有一些问题,编译器可能会告诉您什么。

这可能是一种查看方式。

int read_values(int fd, int *K, int *C, int *E) {

    int *v;
    size_t rb;
    char buf[1024];

    while ((rb = read(fd, buf, sizeof(buf)))) {
        char *i;    /* iterator */
        char *e;    /* end of buffer data */
        for (i = buf, e = buf + rb; i < e; i++) {
            if (isspace(*i))
                continue;
            if (*i == 'C')
                v = C;
            else if (*i == 'E')
                v = E;
            else if (*i == 'K')
                v = K;
            else
                return -1; /* parsing error, unknown value */
            *v = strtol(i + 1, &i, 10);
        }
    }
    
    return 0;
}