2012-08-01 74 views
3

我正在编写一个需要从文本文件中提取字符串和数字数据的C++程序。数据格式如下:从文本中提取字符串数据C++

3225 C9+  ELECTR C8  C  *  1.00E-6 -0.30  0.0 

第一项是一个整数,接下来的5项都是字符串和最后3是浮动。没有字符串长度超过7个字符。

我正在逐行读取文件,然后使用提取数据;

sscanf(ln.c_str(),"%d %s %s %s %s %s %e %e %e", 
&rref[numre],&names[numre][0],&names[numre][1],&names[numre][2],&names[numre][3], 
&names[numre][4],&nums[numre][0],&nums[numre][1],&nums[numre][2]); 

这个工作正常,直到我遇到一条线;

3098 SIC2H3+ ELECTR SIC2H2 H  *  1.50E-7 -0.50  0.0 

其中一个entrys是全长7个字符。在这种情况下,我得到;

names[3097][0] = "SIC2H3+ELECTR" 

,并

names[3097][1] = "ELECTR" 

任何人有任何想法......他们将不胜感激!

+0

字段是否由制表符分隔?或只是空间? – StarPilot 2012-08-01 22:36:03

回答

6

最可能出现的问题是names的声明:如果您声明它为7个或更少的字符,并且忘记分配空间来终止零,则会得到您所描述的结果。

char names[MAX][4][7] 

将有足够的空间用于长度为6或更小的字符串;对于长度为7的字符串,您需要

char names[MAX][4][8] 
+0

没关系...谢谢 – 2012-08-01 22:37:15

+0

在旁边注释...为什么有/什么是终止零? – 2012-08-01 22:40:37

+2

@JoshuaGreenhalgh C字符串不会与字符一起存储长度,所以为了支持可变长度的字符串,我们制定了一个约定来在字符串中的最后一个有意义的字符之后放置一个不可打印字符为零。所有的输入例程都会这样做,所有输出例程最后都会有一个零。这就是为什么你需要分配'max_length + 1'字符来存储'max_length'字符串。 – dasblinkenlight 2012-08-01 22:43:44