2013-11-25 129 views
0

我有一个被格式化这样如何使用fscanf捕获字符串?

A New Day Has Come (Radio Remix); 239 
Ten Days; 227 
Goodbye's (The Saddest Word); 198 
Prayer; 313 
I Surrender; 271 
At Last; 209 
Sorry For Love; 301 

我将如何使用fscanf抢的字符串的文件,并且也是继分号多少?我想这

for(track = 0; track < albums[size].num_tracks; ++track){ 

    fscanf(fileptr,"%s;%i",albums[size].tracks[track].name,albums[size].tracks[track].length); 

    //print out the tracks 
    printf("Track number %i : %s", track, &albums[size].tracks[track].name); 
} 

然而,当发生的printf,整个字符串不打印,而不是像

Track number 0 : A 
Track number 1 : New 
Track number 2 : Day 
etc... 

所以你可以看到,代码捕获了一些个别单词原因,而不是整个字符串在分号之前。我将使用哪种表情来获取整个字符串?编辑为拼写

+0

您是否必须使用fscanf?由于分号分隔文本和数字,为什么不能使用strtok函数呢?这是一个strtok的例子http://www.cplusplus.com/reference/cstring/strtok/ – chuthan20

+0

我想我需要使用fscanf :(该死的C项目 – Zack

+1

当你使用%s时,它会尝试读取字符串,直到非空白字符已到达,所以你会一次得到每个单词 – chuthan20

回答

4

虽然fscanf可能无法在这种情况下,使用最好的功能,正式一个仍然可以用它来抓取,通过使用以下格式说明

fscanf(fileptr, "%[^;];%i", 
    albums[size].tracks[track].name, 
    &albums[size].tracks[track].length); 

这将需要与;结束串输入文件,以坚持非常严格的格式要求。还请注意,如果您的albums[size].tracks[track].lengthint对象,则之前需要&运算符。在fscanf中使用%i格式说明符时,它需要指针int作为参数。

此外,您的printf看起来不正确。它应该是

printf("Track number %i : %s", track, albums[size].tracks[track].name); 

&albums[size].tracks[track].name之前不应该在那里。

+0

由于某种原因这个segfaulted :( – Zack

+0

@ zack:原因必须在你没有显示的东西是否足够接收缓冲区的字符串? – AnT

+0

谨慎解释%[^;]的含义是什么? – Zack

0

您不应fscanf是格式化数据。您的数据格式不符合fscanf的要求。你最好阅读整行,然后搜索分号。

+0

如果我最终不得不这样做,一旦我抓住它,我将如何解析该行。说我是一个完整的C newb Perl/python通常 – Zack

相关问题