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
,然后在 上使用 >>
运算符那个 对象。但是,正如我所说,您无论如何都不应该使用 >>
运算符...
所以我的 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
,然后在 上使用 >>
运算符那个 对象。但是,正如我所说,您无论如何都不应该使用 >>
运算符...