2016-03-06 174 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,然后使用>>运算符对象。但是,正如我所说,你不应该使用>>运营商......