所以我的text.txt看起来像这样:
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 = 60 M Clinton。是因为字符串h不能存储整数60吗?我认为这不是原因。
我正在做getline(infile,h),因为我不关心城镇的名字,Lancaster,Clinton是城镇的名字。
我试图跳过第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行,但它没有用。它只是打破其他线路。
答案 0 :(得分:3)
在我看来,stackoverflow.com上至少有一半的输入解析问题与>>
运算符有关。我从不喜欢使用这个操作符。它具有影响输入解析和输入流错误状态的某些严格的语义,除非输入匹配相同的语义,否则使用>>
运算符将无法可靠地工作。
而且,在现实世界中加入侮辱伤害,输入很少与100%>>
的特质相匹配。
在这种情况下,您的问题是您根本不应该使用>>
运算符。 >>
运算符用于解析以空格分隔的字符串。您已经或多或少地正确识别了问题所在,现在您只需要采取最后一步,完成Jedi的培训,并完全抛弃>>
运营商。你不能轻易用它来解析这种输入。
您的输入看起来像一堆固定宽度的字段。这些字段在每一行上始终占据相同的字符位置。这就是它对我的看法。 >>
运算符不应用于解析此类输入。
相反,您应该使用std::getline
()一次读取一行输入,然后使用substr()
方法从相应的字符位置提取每个字段。然后,对于每个单独的字段,修剪尾随空格,这是微不足道的。
P.S。您甚至没有在正确的对象上使用>>
运算符。您已经使用std::getline()
来读取每一行输入,但无论如何都无法在输入流对象上使用>>
运算符。那是错的。您需要解析刚刚阅读的行,而不是文件中的以下输入,方法是根据刚读取的行构建std::istringstream
,然后使用上的>>
运算符< / strong>对象。但是,正如我所说,你不应该使用>>
运算符......