2016-03-06 171 views
2

所以我的text.txt看起來是這樣的:C++文件讀取錯誤

208 84 Sally Goodnow  30:23 52 F Lancaster 
209 344 Scott Grady   30:28 42 M Clinton 
210 191 gail holland  30:36 52 F worcester 
211 43 Karen Hughes  30:45 46 F Shirley 
212 221 Edward m Powers Jr. 30:48 60 M Clinton 
213 173 Lisa Zancewicz  30:49 34 F Clinton 
214 186 Julianne Ryll  30:54 51 F Clinton 
215 245 Briana Gibson  30:54 27 F Marlborough 

我的代碼讀取該文件看起來是這樣的:

int a; 
int b; 
string c; 
string d; 
string e; 
string f; 
string g; 
string h; 

string mystr; 
int mymin; 
int mysec; 

int i; 


int count=0; 
while((infile>>a>>b>>c>>d>>e>>f>>g)&&getline(infile, h)) 

我的代碼只是在突破212線,我想它與Edward m Powers Jr.這個名字有關(現在我真的很討厭這個名字,每次我看它,大聲笑)。這個名字用完了我的四根琴絃,使h = 60M克林頓。是因爲字符串h不能存儲整數60嗎?我不認爲這是原因。

我正在做getline(infile,h)因爲我不在乎鎮上的名字,蘭開斯特,克林頓都是鎮名。

我試圖跳過線212,我做了這樣的事情:

string all 
while(getline(infile, all) 
{ 
    if(all.at[0]!='2'&&all.at[1]!='1'&&all.at[2]!='2') 
    { 
     infile>>a>>b>>c>>d>>e>>f>>g; 
     getline(infile, h); 

我這樣做只是爲了跳過線212,但沒有奏效。它只是在其他線路中斷。

回答

3

它看起來像我這裏至少有一半的輸入解析問題在這裏stackoverflow.com與>>運算符。我從不喜歡使用這個操作符。它具有某些影響輸入解析和輸入流錯誤狀態的嚴格語義,除非輸入匹配相同的語義,否則使用運算符將​​無法可靠地工作。

而且,在現實世界中增加對傷害的侮辱,輸入很少匹配100%的特質。

在這種情況下,您的問題是您根本不應該使用>>運算符。 >>運算符用於解析以空格分隔的字符串。您已經或多或少地正確識別了問題出在哪裏,現在您只需要採取最後一步,即可完成絕地訓練,並完全清除操作員。你不能輕易使用它來解析這種輸入。

您的輸入看起來像一堆固定寬度的字段。這些字段在每行上總是佔據相同的字符位置。這就是它對我的看法。運算符不用於解析這種輸入。

相反,您應該一次讀取輸入的一行,使用std::getline(),然後使用substr()方法從相應的字符位置提取每個字段。然後,對於每個單獨的字段,修剪尾隨的空白,這是微不足道的。

P.S.您甚至沒有在正確的對象上使用>>運算符。您已經在使用std::getline()來讀取輸入的每一行,但無論如何莫名其妙地在輸入流對象上使用>>運算符。這是錯誤的。您需要解析剛剛讀取的行,而不是文件中的以下輸入,方法是根據剛剛讀取的行構建一個std::istringstream,然後使用>>運算符對象。但是,正如我所說,你不應該使用>>運營商......