问题描述
我想打开一个名为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,E);
//endtodo
CHECK_EQ(close,len=close(fin),"Closing file in input %s : errno=%d\n",errno);
return 0;
}
int read_values(int fin,int *K,int *C,int *E){
//todo
}
如何实现该功能?
解决方法
您的代码中有一些问题,编译器可能会告诉您什么。
这可能是一种查看方式。
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;
}