2012-08-01 76 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