gpt4 book ai didi

c - 如何在C中读取文本文件中标点符号分隔的变量

转载 作者:行者123 更新时间:2023-11-30 14:49:32 25 4
gpt4 key购买 nike

我想知道如何从数据以逗号分隔的文本文件中读取数据。

例如,文本文件的第 1 行显示:(Integer,Name Surname, IntegerArray)

这是 1 行:123456789,Jonh Brown,123456434-4325234-235234-42345234

typedef struct BST
{
long long ID;
char *name;
char *surname;
long long *friendsID;
struct BST *left;
struct BST *right;
}BST;

从文件中读取:

do
{
c = fscanf(fp,"%I64d%*c%s%s",&ID,name,surname);
if (c != EOF)
root=insertNewUser(root,ID,name,surname);
} while (c != EOF);

newNodeTemp->ID = ID;
newNodeTemp->name = (char*)calloc(strlen(name),sizeof(char));
newNodeTemp->surname = (char*)calloc(strlen(surname),sizeof(char));
strcpy(newNodeTemp->name,name);
strcpy(newNodeTemp->surname,surname);

但我不知道如何将其作为数组放入 BST->friends 中,而无需 '-'(连字符)。

这部分:123456434-4325234-235234-42345234

我将数组的友元定义为指针。因为我们不知道它的大小。我将使用动态内存分配...

最佳答案

如果我理解你的问题,你有一个包含用户信息和该用户的 friend 的 CSV,其中 friend 被编码为连字符分隔的 friend ID 列表作为该行中的第三个字段,那么你可以使用strtok 的可重入版本(名为 strtok_r)的组合,用于分隔逗号分隔的字段,然后在您的代码中使用对 strtok 的调用外部循环来分隔连字符分隔值。

请注意,strtok_r 需要一个额外的“保存指针”作为其第三个参数,以便您可以在之后恢复对 strtok_r 实例的调用为了替代分离目的而对 strtokstrtok_r 的不同实例进行中间调用。

鉴于您的行:

"123456789,Jonh Brown,123456434-4325234-235234-42345234"

其中 123456789 是 ID,Jonh Brown 是姓名,123456434-4325234-235234-42345234 是好友 ID 列表,您可以解析该行和各个 friend ,只需保留字段计数并在分词循环中调用 strtok 的单独实例来分隔连字符上的 friend 。

一个简短的例子是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FRIENDS 3

int main (void) {

char line[] = "123456789,Jonh Brown,123456434-4325234-235234-42345234",
*delims = ",\n", /* strtok_r delimiters for tokens */
*p = line, /* pointer to line */
*sp = p; /* save pointer for reentrant strtok_r */
int count = 0;

/* must use reentrant version of strtok to nest strtok use for friends */
p = strtok_r (line, delims, &sp); /* 1st call uses name of buffer */
count++;

while (p) { /* outputer tokenization loop */
printf ("token: '%s'\n", p);
if (count == FRIENDS) {
char *pf = calloc (strlen (p) + 1, 1), /* pointer to friends */
*delim2 = "-\n", /* delims for friends */
*f; /* pointer preserves pf */
if (!pf) {
perror ("malloc-pf");
exit (EXIT_FAILURE);
}
strcpy (pf, p); /* copy friends token to pf */
f = pf; /* set f, to pf, to preserve pf */
f = strtok (f, delim2); /* regular strtok OK for friends */
if (f)
printf ("friends:\n");
while (f) { /* friends tokenization loop */
printf (" %s\n", f);
f = strtok (NULL, delim2); /* subsequent calls use NULL */
}
free (pf); /* free allocated memory at preserved address */
count = 0; /* reset count */
}
p = strtok_r (NULL, delims, &sp); /* subsequent calls use NULL */
count++;
}

return 0;
}

(注意:由于 strtok 修改了原始字符串并推进了它使用的指针,因此您必须复制 Friends token ,并保留指向起始字符串的指针为 friend 分配的 token 的地址(pf),以便在您完成与 friend 分离后可以释放它)

(另请注意:如果您的系统提供了strdup,则可以替换两个calloc(strlen(p) + 1, 1)strcpy (pf, p); 通过简单调用 char *pf = strdup(p); 进行调用。但请注意,因为 strdup动态分配,您仍然应该在调用后验证 if (!pf))

示例使用/输出

$ ./bin/strtok_csv
token: '123456789'
token: 'Jonh Brown'
token: '123456434-4325234-235234-42345234'
friends:
123456434
4325234
235234
42345234

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 如何在C中读取文本文件中标点符号分隔的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49543925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com