C++文件读取错误

C++ file reading error

所以我的 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) 因为我不关心城镇名称,兰开斯特、克林顿是城镇名称。

我试图跳过第 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 行,但它没有用。它只是在其他行中断。

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

而且,雪上加霜的是,在现实世界中,输入很少能 100% 匹配 >> 的特质。

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

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

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

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