2016-12-06 144 views
0

我正在使用strtok()函数在新行分隔符上拆分文件缓冲区,但我得到的结果并不符合我的预期。strtok()不按预期方式工作

patient->fullName = strtok(fileContent, "\n"); 
patient->dateOfBirth = strtok(NULL, "\n"); 
patient->height = strtok(NULL, "\n"); 
patient->waistMeasurement = strtok(NULL, "\n"); 
patient->weight = strtok(NULL, "\n"); 
patient->comment = strtok(NULL, "\n"); 

当我保存分隔的值成结构成员的每一个成员显示细腻以后除了第一个,fullName。如果我明白了,它会显示地址值。下面是输出:

enter image description here

因为我仍然不熟悉C,请你告诉我,我怎样才能得到这实际上该文件中写入该指针地址的地方全名?

编辑:创作fileContent

FILE *file = fopen(fileName, "r"); 

fseek(file, 0, SEEK_END); 
long size = ftell(file); 
rewind(file); 

char *fileContent = malloc(size + 1); 
fread(fileContent, size, 1, file); 

病人:

struct Patient 
{ 
    char *fullName; 
    char *dateOfBirth; 
    char *height; 
    char *waistMeasurement; 
    char *weight; 
    char *comment; 
}; 

struct Patient *patient = malloc(sizeof(*patient)); 

patient->fullName = malloc(sizeof(NAME_LENGTH)); 
patient->dateOfBirth = malloc(sizeof(BIRTHDAY_LENGTH)); 
patient->height = malloc(sizeof(HEIGHT_LENGTH)); 
patient->waistMeasurement = malloc(sizeof(WAIST_LENGTH)); 
patient->weight = malloc(sizeof(WEIGHT_LENGTH)); 
patient->comment = malloc(sizeof(COMMENT_LENGTH)); 

保存文件的文件内容(它的加密虽然):

Qevms Wqspgmg 
49.46.5336. 
534,9 
84,7 
28,6 
Li'w jygomrk eaiwsqi hyhi! 
+1

在用'strtok()'剪切它之前,显示存储在'fileContent'中的值是明智的。显示“病人”指向的结构的定义也是明智的。这些是使这个位置靠近MCVE([MCVE])的基本要求 - 虽然你仍然可以说是偏离了最低限度。 –

+2

请注意,由'malloc()'调用分配的空间全部因使用'strtok()'而丢失 - 您正在泄漏。您需要使用'strcpy()'将字符串复制到分配的空间中。在复制之前,您需要检查是否分配了足够的空间。或者你应该使用'strdup()'''patient-> fullName = strdup(strtok(fileContent,“\ n”));'。此外,因为您正在复制指向'fileContent'的指针,所以如果您将下一行读入'fileContent',它将更改之前'patient'记录指向的字符串的值。或'fileContent'超出范围并被用于其他目的。 –

+0

@JonathanLeffler非常感谢。这对我有效。 – msmolcic

回答

3

请注意,malloc()呼叫分配的空间全部因使用strtok()而丢失 - 您正在泄漏。您需要使用strcpy()将字符串复制到分配的空间中。在复制之前,您需要检查是否分配了足够的空间。或者你可以使用POSIX功能strdup() - patient->fullName = strdup(strtok(fileContent, "\n"));。 (这是一点点冒险。我通常将它传递给strdup()前检查从strtok()回 - 但它使点)

而且,因为你复制指针fileContent,如果你读下一行成fileContent,它会改变前面的patient记录所指向的字符串的值。或者,当fileContent超出范围并用于其他目的时,数据将再次更改。

+0

非常感谢。我在这个函数的作用域内使用了fileContent来从文本文件中读取数据并将值保存到结构体中,但是将字符串值复制到分配的空间中并没有做到这一点。 – msmolcic