C ++文件读取错误

时间:2016-03-06 00:58:17

标签: c++ error-handling readfile

所以我的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行,但它没有用。它只是打破其他线路。

1 个答案:

答案 0 :(得分:3)

在我看来,stackoverflow.com上至少有一半的输入解析问题与>>运算符有关。我从不喜欢使用这个操作符。它具有影响输入解析和输入流错误状态的某些严格的语义,除非输入匹配相同的语义,否则使用>>运算符将无法可靠地工作。

而且,在现实世界中加入侮辱伤害,输入很少与100%>>的特质相匹配。

在这种情况下,您的问题是您根本不应该使用>>运算符。 >>运算符用于解析以空格分隔的字符串。您已经或多或少地正确识别了问题所在,现在您只需要采取最后一步,完成Jedi的培训,并完全抛弃>>运营商。你不能轻易用它来解析这种输入。

您的输入看起来像一堆固定宽度的字段。这些字段在每一行上始终占据相同的字符位置。这就是它对我的看法。 >>运算符不应用于解析此类输入。

相反,您应该使用std::getline()一次读取一行输入,然后使用substr()方法从相应的字符位置提取每个字段。然后,对于每个单独的字段,修剪尾随空格,这是微不足道的。

P.S。您甚至没有在正确的对象上使用>>运算符。您已经使用std::getline()来读取每一行输入,但无论如何都无法在输入流对象上使用>>运算符。那是错的。您需要解析刚刚阅读的行,而不是文件中的以下输入,方法是根据刚读取的行构建std::istringstream,然后使用上的>>运算符< / strong>对象。但是,正如我所说,你不应该使用>>运算符......