void getCmdResult(const char* cmd, char** resultbuf, size_t* bufsize) { FILE* fp = popen(cmd, "r"); if (fp) { *resultbuf = malloc(*bufsize); fgets(*resultbuf, bufsize, fp); pclose(fp); } } HUAYI_BOOL checkFileExistsAndNotEmpty(const char filename) { // 检查文件是否存在 if (access(filename, F_OK) == -1) { return HUAYI_FALSE; } // 检查文件大小是否为0 struct stat fileStat; if (stat(filename, &fileStat) == -1) { return HUAYI_FALSE; } if (fileStat.st_size == 0) { return HUAYI_FALSE; } return HUAYI_TRUE; } HUAYI_BOOL TcpObtainServervalue(int count, ...) { char* resultbuf = NULL; size_t bufsize = 1024; char cmd[TEMP_STR_LEN]; int counter = 0; va_list args; va_start(args, count); strcpy(cmd, "cat /tmp/returnValue"); do { if (counter > 10) return HUAYI_FALSE; else if (counter) sleep(1); if (resultbuf) free(resultbuf); getCmdResult(cmd, &resultbuf, &bufsize); counter++; }while (!checkFileExistsAndNotEmpty("/tmp/returnValue")); char* token = strtok(resultbuf, " "); int i = 0; while (token != NULL && i < count) { char* str = va_arg(args, char*); strcpy(str, token); token = strtok(NULL, " "); i++; } va_end(args); unlink("/tmp/returnValue"); free(resultbuf); return HUAYI_TRUE; } int name1; char name2[128],name3[128]; /tmp/returnValue文件内容为 "3 zhangsan www" TcpObtainServervalue(3,&name1,name2,name3); 优化TcpObtainServervalue程序如果取值为整数则赋值整数,为字符则字符指针
时间: 2024-04-09 22:33:19 浏览: 46
为了优化TcpObtainServervalue函数,使其能够根据参数类型自动赋值整数或字符指针,可以使用可变参数模板进行重构。以下是优化后的代码示例:
```c
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#define TEMP_STR_LEN 256
#define HUAYI_BOOL int
#define HUAYI_TRUE 1
#define HUAYI_FALSE 0
void getCmdResult(const char* cmd, char** resultbuf, size_t* bufsize) {
FILE* fp = popen(cmd, "r");
if (fp) {
*resultbuf = malloc(*bufsize);
fgets(*resultbuf, *bufsize, fp);
pclose(fp);
}
}
HUAYI_BOOL checkFileExistsAndNotEmpty(const char* filename) {
// 检查文件是否存在
if (access(filename, F_OK) == -1) {
return HUAYI_FALSE;
}
// 检查文件大小是否为0
struct stat fileStat;
if (stat(filename, &fileStat) == -1) {
return HUAYI_FALSE;
}
if (fileStat.st_size == 0) {
return HUAYI_FALSE;
}
return HUAYI_TRUE;
}
void assignValue(void* arg, const char* token) {
if (arg == NULL || token == NULL) {
return;
}
if (strncmp(token, " ", 1) == 0) {
return;
}
if (isdigit(token[0])) {
int* intValue = (int*)arg;
*intValue = atoi(token);
} else {
char* strValue = (char*)arg;
strcpy(strValue, token);
}
}
HUAYI_BOOL TcpObtainServervalue(int count, ...) {
char* resultbuf = NULL;
size_t bufsize = 1024;
char cmd[TEMP_STR_LEN];
int counter = 0;
va_list args;
va_start(args, count);
strcpy(cmd, "cat /tmp/returnValue");
do {
if (counter > 10) {
return HUAYI_FALSE;
} else if (counter) {
sleep(1);
}
if (resultbuf) {
free(resultbuf);
}
getCmdResult(cmd, &resultbuf, &bufsize);
counter++;
} while (!checkFileExistsAndNotEmpty("/tmp/returnValue"));
char* token = strtok(resultbuf, " ");
int i = 0;
while (token != NULL && i < count) {
void* arg = va_arg(args, void*);
assignValue(arg, token);
token = strtok(NULL, " ");
i++;
}
va_end(args);
unlink("/tmp/returnValue");
free(resultbuf);
return HUAYI_TRUE;
}
int main() {
int name1;
char name2[128], name3[128];
TcpObtainServervalue(3, &name1, name2, name3);
printf("name1: %d\n", name1);
printf("name2: %s\n", name2);
printf("name3: %s\n", name3);
return 0;
}
```
在优化后的代码中,我们定义了一个新的函数`assignValue`,它用于根据参数类型将值赋给相应的变量。`assignValue`函数接受两个参数,第一个参数是void指针,可以接受任意类型的指针;第二个参数是字符串token,用于解析出来的值。在`TcpObtainServervalue`函数中,我们使用`assignValue`函数将解析出来的值赋给相应的变量。
请注意,在使用`TcpObtainServervalue`函数时,需确保传递给它的参数数量和类型与实际情况相匹配。
阅读全文