gpt4 book ai didi

c - token 之间没有数据时解析文件

转载 作者:太空宇宙 更新时间:2023-11-04 04:31:15 24 4
gpt4 key购买 nike

大家好,我正在读取一个文件并想将数据解析为一个结构数组。该文件看起来像这样:

Country,City,Area Code,Population
China,Beijing,,21256972
France,Paris,334,3568253
Italy,Rome,,1235682

我想解析数据并将成员分配给文件中的各个区域。我在解析第 1 行和第 3 行的数据时没有问题。但是如果没有区号并且彼此相邻有两个逗号,则 token 变为空并且我收到错误消息。我一直在寻找,似乎无法找到解决方案。这是我的代码:

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

int main(void) {
static struct Locations {
char country[20];
char city[20];
char areaCode[5];
char population[100];
} line[2000000];

// open file
FILE *Lfile;
Lfile = fopen("locations.txt", "r");
if (!Lfile) {
perror("File Error");
}

char buf[100];
const char delim[2] = ",";
char *token;

int i = 0;
while (fgets(buf, 100, Lfile) != NULL) {
token = strtok(buf, delim);
while (token != NULL) {
strcpy(line[i].country, token);
token = strtok(NULL, delim);
strcpy(line[i].city, token);
token = strtok(NULL, delim);
strcpy(line[i].areaCode, token); //Error here
token = strtok(NULL, delim);
strcpy(line[i].population, token);
token = strtok(NULL, delim);
}
printf("%s %s %s %s\n", line[i].country,
line[i].city, line[i].areaCode, line[i].population);
i++;
}
return 0;
}

最佳答案

您不能使用 strtok()拆分 CSV 文件,因为 strtok将分隔符字符串中的字符序列视为单个分隔符。它仅用于拆分以空格分隔的标记。

您不能使用 sscanf("%[^,]", ...)要么因为sscanf期望解析至少一个不同于 , 的字符.

你可以使用 strchr ,或者您可以使用 <string.h> 中的另一个函数为了您的目的:strcspn() :

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

/* copy at most len bytes from src to an array size char and
null terminate it. Return the length of the resulting C string
possibly smaller than len if the destination is too small.
*/
size_t strcpymem(char *dest, size_t size, const char *src, size_t len) {
if (len >= size)
len = size - 1;
memcpy(dest, src, len);
dest[len] = '\0';
return len;
}

#define RECORD_NUMBER 2000000

int main(void) {
static struct Locations {
char country[20];
char city[20];
char areaCode[5];
char population[100];
} line[RECORD_NUMBER];

// open file
FILE *Lfile;
Lfile = fopen("locations.txt", "r");
if (!Lfile) {
perror("File Error");
}

char buf[100];

int i = 0;
while (i < RECORD_NUMBER && fgets(buf, 100, Lfile) != NULL) {
char *p = buf;
int len = strcspn(p, ",\n");
strcpymem(line[i].country, sizeof line[i].country, p, len);
p += len;
if (*p == ',') p++;
len = strcspn(p, ",\n");
strcpymem(line[i].city, sizeof line[i].city, p, len);
p += len;
if (*p == ',') p++;
len = strcspn(p, ",\n");
strcpymem(line[i].areacode, sizeof line[i].areacode, p, len);
p += len;
if (*p == ',') p++;
len = strcspn(p, ",\n");
strcpymem(line[i].population, sizeof line[i].population, p, len);
printf("%s %s %s %s\n", line[i].country,
line[i].city, line[i].areaCode, line[i].population);
i++;
}
return 0;
}

关于c - token 之间没有数据时解析文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35996412/

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