令牌存储不当?文件解析问题
Improper storage of token? Problems with file parsing
我正在处理一个项目,我需要从文件中对一些数据进行排序。该文件是由 "tab space" 分隔的一长串字符串(我认为该文件是分隔的,但我不确定)。这是文件一行的示例:
2986043 Pic de Font Blanca Pic de Font Blanca Pic de Font Blanca,Pic du Port 42.64991 1.53335 T PK AD
中间的两个双打(e/g: 42.64991 & 1.5335),是我关心的,因为我要存储它们并在以后使用它们进行排序。这只是一个使用前 1000 行输入数组的原型,但文件的实际大小是数百万行。实际的数据结构将是某种链表(我想?不确定什么最适合这种工作)
这是一组循环,我在其中标记文件指针中的字符串,并尝试将字符串复制到我设置的指针数组中:
int curr_line=0;
int longlat;
char* coord[1000][2];
/* clock starts to time process
* this pair of loops works through each line of the file, token by token
*
*/
start = clock();
while(fgets(duff, 512, (FILE*)fp) !=NULL)
{
int coordFlag=0;
//char* token=strtok(duff, " ");
char* token=strtok(duff, " \t");
while(token)
{
if(verify(token))
{
//printf("tok: %s\n", token);
coordFlag++;
if(coordFlag==1)
{
printf("%s||", token);
strcpy(coord[curr_line][0], token);
}
if(coordFlag==2)
{
printf("%s\n", token);
strcpy(coord[curr_line][1], token);
}
}
//printf("tok: %s\n", token);
token=strtok(NULL, " \t");
}
curr_line++;
if(curr_line==1000) break;
}
目前,我遇到一个运行时错误,程序在尝试存储第一个字符串时崩溃。我相信我错误地使用了数组 and/or、字符串和标记的字符指针。
我的主要目标是解析由空格和制表符分隔的字符串行,并获取中间的两个字符串,即经度和纬度,并将它们存储在数组中。
作为后续问题,如何将此存储作为双打来完成。比如,我可以解析令牌,然后创建一个空白的双精度变量,复制已解析的令牌并将其存储为双精度类型并使用类型转换或其他更有效的策略吗?
您正在使用未初始化且无意义的指针来存储令牌,这非常糟糕。
在复制字符串之前分配用于存储标记的缓冲区。
if(coordFlag==1)
{
printf("%s||", token);
coord[curr_line][0] = malloc(strlen(token) + 1); // add this line
strcpy(coord[curr_line][0], token);
}
if(coordFlag==2)
{
printf("%s\n", token);
coord[curr_line][1] = malloc(strlen(token) + 1); // add this line
strcpy(coord[curr_line][1], token);
}
备注:
- 不要忘记
+1
终止空字符。
- 添加一些代码来检查
malloc()
是否成功并处理错误将使这段代码变得更好。
我正在处理一个项目,我需要从文件中对一些数据进行排序。该文件是由 "tab space" 分隔的一长串字符串(我认为该文件是分隔的,但我不确定)。这是文件一行的示例:
2986043 Pic de Font Blanca Pic de Font Blanca Pic de Font Blanca,Pic du Port 42.64991 1.53335 T PK AD
中间的两个双打(e/g: 42.64991 & 1.5335),是我关心的,因为我要存储它们并在以后使用它们进行排序。这只是一个使用前 1000 行输入数组的原型,但文件的实际大小是数百万行。实际的数据结构将是某种链表(我想?不确定什么最适合这种工作)
这是一组循环,我在其中标记文件指针中的字符串,并尝试将字符串复制到我设置的指针数组中:
int curr_line=0;
int longlat;
char* coord[1000][2];
/* clock starts to time process
* this pair of loops works through each line of the file, token by token
*
*/
start = clock();
while(fgets(duff, 512, (FILE*)fp) !=NULL)
{
int coordFlag=0;
//char* token=strtok(duff, " ");
char* token=strtok(duff, " \t");
while(token)
{
if(verify(token))
{
//printf("tok: %s\n", token);
coordFlag++;
if(coordFlag==1)
{
printf("%s||", token);
strcpy(coord[curr_line][0], token);
}
if(coordFlag==2)
{
printf("%s\n", token);
strcpy(coord[curr_line][1], token);
}
}
//printf("tok: %s\n", token);
token=strtok(NULL, " \t");
}
curr_line++;
if(curr_line==1000) break;
}
目前,我遇到一个运行时错误,程序在尝试存储第一个字符串时崩溃。我相信我错误地使用了数组 and/or、字符串和标记的字符指针。
我的主要目标是解析由空格和制表符分隔的字符串行,并获取中间的两个字符串,即经度和纬度,并将它们存储在数组中。
作为后续问题,如何将此存储作为双打来完成。比如,我可以解析令牌,然后创建一个空白的双精度变量,复制已解析的令牌并将其存储为双精度类型并使用类型转换或其他更有效的策略吗?
您正在使用未初始化且无意义的指针来存储令牌,这非常糟糕。
在复制字符串之前分配用于存储标记的缓冲区。
if(coordFlag==1)
{
printf("%s||", token);
coord[curr_line][0] = malloc(strlen(token) + 1); // add this line
strcpy(coord[curr_line][0], token);
}
if(coordFlag==2)
{
printf("%s\n", token);
coord[curr_line][1] = malloc(strlen(token) + 1); // add this line
strcpy(coord[curr_line][1], token);
}
备注:
- 不要忘记
+1
终止空字符。 - 添加一些代码来检查
malloc()
是否成功并处理错误将使这段代码变得更好。