我正在尝试用 C 解析 csv 文件,其中分隔符|使用strtok. 问题是某些字段为空,因此两个分隔符彼此相邻放置。看起来strtok只是跳过所有空字段并仅输出下一个非空字段。
问题是我需要知道正在读取的令牌属于哪个位置。
这是一个非常小的例子来说明。
文件
node|171933|||traffic_signals|||||40.4200658|-3.7016652
Run Code Online (Sandbox Code Playgroud)
例如,这一行有 10 个字段,但只有字段 1、2、9 和 10 具有一些值。
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
FILE *fp;
char lineBuf[128];
char *token;
int i=0;
if((fp = fopen("test.txt", "r"))==NULL){
fprintf (stderr, "\nError when opening file\n");
return ;
}
fgets (lineBuf, sizeof(lineBuf), fp);
token=strtok(lineBuf, "|\n");
while(token!=NULL){
printf("Element %d: %s\n",i,token); i++;
token=strtok(NULL, "|\n");
}
}
Run Code Online (Sandbox Code Playgroud)
输出
Element 0: node
Element 1: 171933
Element 2: traffic_signals
Element 3: 40.4200658
Element 4: -3.7016652
Run Code Online (Sandbox Code Playgroud)
预期产出
Element 0: node
Element 1: 171933
Element 4: traffic_signals
Element 9: 40.4200658
Element 10: -3.7016652
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以按预期解析这样的行?一行中的元素数量先前未定义。
我已经知道所显示的行为strtok是通常的行为,我只是要求另一种方法来获得所需的结果,而不是解释为什么会发生这种情况。
我不确定你在哪个平台上,但 strsep() 是建议替代你想要做的事情。
曼斯特塞普
while (fgets(buf, BUFSIZE, fp) != NULL) {
char *line = buf;
char *field;
int index = 0;
while ((field = strsep(&line, "|")) != NULL) {
/* note the trailing field will contain newline. */
printf("element %d = %s\n", index, field);
index++;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4296 次 |
| 最近记录: |