2013-12-13 259 views
1

我正在创建一个C程序,它可以逐行读取CSV文件。因此,每一行这样分配:解析解析字符串

sch = strtok (line,","); 

第一令牌(且仅需要一个)的形式是一个日期 - 时间戳记:2013-12-13 09:15:00.000

我怎样才能再向上拆分此令牌,使用空间)只存储令牌的时间部分09:15:00.000

感谢您的帮助 - 我已经更新了我在这里的代码,以反映低于建议的修改,但是当你尝试执行它在我的程序崩溃:

while (fgets (line, 512, file) != NULL) 
{ 
    sch = strtok (line,","); 
    if (sch != NULL) 
    { 
     sch = strtok (line," "); 
     sch = strtok (NULL," "); 
     fputs(sch,filetwo); 
     fputc('\n',filetwo); 
     break; 
    } 
sch = strtok (NULL, ","); 
} 

回答

3

然后,你会再打电话strtok。请参阅下面的

while (fgets (line, 512, file) != NULL) 
{ 
    char * tmp = strtok (line,","); 
    if (tmp != NULL) 
    { 
     sch = strtok (tmp," "); 
     sch = strtok (NULL," "); 
     fputs(sch,filetwo); 
     fputc('\n',filetwo); 
    } 
} 
+1

好的也摆脱了无意义的'while'和'break'。 –

+0

感谢您的支持 - 当我尝试执行时,我的程序现在崩溃了。我更新了原始问题中的代码。 –

+0

@DustinCook:不客气。 – David

1

使用NULL指针而不是字符串调用函数strtok以获取下一个结果。

请记住C库有一个状态。它会记住最后一个令牌并将其用于进一步调用。因此,当您开始“标记化”时,您无法返回下一个','分隔的标记。

if (sch != NULL) 
{ 
    sch = strtok(line, " "); 
    time_section = strtok(NULL, " "); 
} 
0

你可以做这样的事情,而不是,也没有必要使用strtok()因为你只需要在第一个CSV场。

while (fgets (line, 512, file) != NULL) 
{ 
    char* datetime = strchr(line,","); 
    if (datetime != NULL) 
    { 
    char *spc = strchr(datetime, ' '); // find space 
    if (spc != NULL) 
    { 
     char* timeonly = spc + 1; // move past spc, point to time part 
    ...