我想打开一个名为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
}
如何实现该功能?
答案 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;
}