#define LINES 4
#define LENGHT 30
typedef struct
{
char *name;
char *phoneNumber;
char *location;
char *traveltype;
} Client;
int main(int argc, char *argv[])
{
char *filename = argv[1];
char clientData[LINES][LENGHT];
readClientData(filename, clientData);
/* How to do this client struct */
Client *client = createClient(clientData[0], clientData[1], clientData[2], clientData[3]);
return 0;
}
void readClientData(char *filename, char clientData[LINES][LENGHT])
{
FILE *file = fopen(filename, "r");
if (file == NULL)
{
perror("Error while opening file!");
exit(1);
}
char line[LENGHT];
int i = 0;
while (fgets(line, LENGHT, file) != NULL)
clientData[i] = line; /* How to do this */
i++;
fclose(file);
}
来自pythonista世界,我有点困惑这里的工作方式。显然,我不能只向列表中添加行,也不能像初始化客户端结构那样添加行。
也许我应该只使用char *clientData[],但不知道如何使用。
要复制C字符串,您需要使用:
char * strcpy ( char * destination, const char * source );
从标准C字符串库中获得string.h。
然而,通知,比Python的不同(你的背景),压痕并没有定义循环的身体,你需要使用大括号!
因此,您需要这样做:
while (fgets(line, LENGHT, file) != NULL)
{
strcpy(clientData[i], line);
i++;
}
如果没有大括号,则仅将代码的第一直接行视为循环的主体。因此,在上面的示例中,如果不使用大括号,则循环的主体将只是对复制字符串的方法的调用,而计数器的增量将不会成为循环的一部分!
您需要定义或只声明一个方法,然后再使用它,而您在示例中没有这样做。
由于您只需要一个客户端,因此不需要指针,因此只需创建一个即可Client client;。
为了简单起见,请使用到目前为止所获得的知识,并定义字符串的最大长度(即结构的每个字段都具有的字符数组的大小)。请记住,C字符串必须以NULL终止,因此,它们的最大长度实际上是LENGTH - 1。
如果将struct的字段保留为的指针char,则需要动态分配内存,或将指针指向clientData数组的相应字符串(类似于对文件名所做的操作)。我建议您先获得一些C方面的经验,然后再尝试实现这两种方法。
现在,您准备好了:
strcpy(client.name, clientData[0]);
...
strcpy(client.traveltype, clientData[3]);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINES 4
#define LENGTH 30
typedef struct
{
char name[LENGTH];
char phoneNumber[LENGTH];
char location[LENGTH];
char traveltype[LENGTH];
} Client;
void readClientData(char *filename, char clientData[LINES][LENGTH]);
void printClient(Client client);
int main(int argc, char *argv[])
{
char *filename = NULL;
if(argc > 1)
filename = argv[1];
else
{
printf("Usage: %s <filename>\n", argv[0]);
}
char clientData[LINES][LENGTH];
readClientData(filename, clientData);
Client client;
strcpy(client.name, clientData[0]);
strcpy(client.phoneNumber, clientData[1]);
strcpy(client.location, clientData[2]);
strcpy(client.traveltype, clientData[3]);
printClient(client);
return 0;
}
void readClientData(char *filename, char clientData[LINES][LENGTH])
{
FILE *file = fopen(filename, "r");
if (file == NULL)
{
perror("Error while opening file!");
exit(1);
}
char line[LENGTH];
int i = 0;
while (fgets(line, LENGTH, file) != NULL)
{
line[strcspn(line, "\n")] = 0;
strcpy(clientData[i], line);
i++;
}
fclose(file);
}
void printClient(Client client)
{
printf("%s, %s, %s, %s\n", client.name, client.phoneNumber, client.location, client.traveltype);
}
输出:
Georgioss-MBP:Desktop gsamaras$ cat test.txt
MegasAlexandros
3335632320
Greece
Cosmos
Georgioss-MBP:Desktop gsamaras$ gcc main.c
Georgioss-MBP:Desktop gsamaras$ ./a.out test.txt
MegasAlexandros, 3335632320, Greece, Cosmos
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。