C++ c++;如何阻止循环两次吐出最后一个输入

C++ c++;如何阻止循环两次吐出最后一个输入,c++,visual-studio,loops,fstream,C++,Visual Studio,Loops,Fstream,我正在做一个银行程序,在我的存款功能中,我有以下代码,从文本文件中读取并将金额存储到famount中。 唯一的问题是,当我运行程序并输出famount时,前一行的数据与其上一行的数据完全相同 这是一段代码 file>>firstname>>lastname; cout<<endl<<firstname<<" "<<lastname<<endl; string line; while (getline(file,

我正在做一个银行程序,在我的存款功能中,我有以下代码,从文本文件中读取并将金额存储到famount中。 唯一的问题是,当我运行程序并输出famount时,前一行的数据与其上一行的数据完全相同

这是一段代码

file>>firstname>>lastname;
cout<<endl<<firstname<<" "<<lastname<<endl;
string line;
while (getline(file, line))
{
    //stringstream the getline for line string in file
    istringstream iss(line);
    file>>date>>amount;
    iss >> date >> amount;


    cout<<date<<"\t\t"<<amount<<endl;
    famount+=amount;

    // I tried to use this to stop reading after 
    // to the file ends but it still reads the last 
    // data on the file twice.
    if(file.eof()){
        break;
    }
}
cout<<famount;
文件>>名字>>姓氏;

cout您可能希望将代码更改为:

file>>firstname>>lastname;
cout<<endl<<firstname<<" "<<lastname<<endl; 
string line;
while (getline(file, line))
{
    //stringstream the getline for line string in file
    istringstream iss(line);
    // file>>date>>amount; // that line seems a bit off...
    if (iss >> date >> amount;) // it would have failed before when line was an empty last line.
    {

        cout<<date<<"\t\t"<<amount<<endl;
        famount+=amount;
    }

}
cout<<famount;
文件>>名字>>姓氏;

cout您可能希望将代码更改为:

file>>firstname>>lastname;
cout<<endl<<firstname<<" "<<lastname<<endl; 
string line;
while (getline(file, line))
{
    //stringstream the getline for line string in file
    istringstream iss(line);
    // file>>date>>amount; // that line seems a bit off...
    if (iss >> date >> amount;) // it would have failed before when line was an empty last line.
    {

        cout<<date<<"\t\t"<<amount<<endl;
        famount+=amount;
    }

}
cout<<famount;
文件>>名字>>姓氏;

不能“咕哝两次”->
eof()
滥用。不要使用
eof()
。这毫无意义。请检查您的输入操作。
文件>>日期>>金额;iss>>日期>>金额您将提取两次,一次从文件中提取,一次从stringstream中提取。为什么?我还在试着看这段代码是如何用输入生成输出的。。我还是没看到。如果有任何问题,我希望它输出的数据比您想要的少,而不是更多,因为除了循环内的无关的
文件>>日期>>数量之外,没有其他具体原因,在添加每行处理时,您显然忽略了删除该数量。等待现在我看到了。@WhozCraig如果他在输入中得到一个空的最后一行,while条件中的getline将成功,但他将无法从设置为空行的stringstream中提取日期和金额。@Tribse是的,这就是我的想法。我花了一分钟的时间才意识到,即使是第一个
getline
都是错误的,随后的
getline
调用总是在错误地放置摘录后读取剩余的换行符(+1,顺便说一句)。“咕哝两次”->
eof()
滥用。不要使用
eof()
。这毫无意义。请检查您的输入操作。
文件>>日期>>金额;iss>>日期>>金额您将提取两次,一次从文件中提取,一次从stringstream中提取。为什么?我还在试着看这段代码是如何用输入生成输出的。。我还是没看到。如果有任何问题,我希望它输出的数据比您想要的少,而不是更多,因为除了循环内的无关的
文件>>日期>>数量之外,没有其他具体原因,在添加每行处理时,您显然忽略了删除该数量。等待现在我看到了。@WhozCraig如果他在输入中得到一个空的最后一行,while条件中的getline将成功,但他将无法从设置为空行的stringstream中提取日期和金额。@Tribse是的,这就是我的想法。我花了一分钟才意识到,即使是第一个
getline
都是错误的,随后的
getline
调用总是在错误地放置提取后读取剩余的换行符(+1在您的答案上,顺便说一句)。+1这显然是每行处理的正确方法,分析这如何导致重复的最后一行(即使没有原始代码中的
文件.eof()
调用它也会重复),这是一个有趣的脑筋急转弯。“//文件>>日期>>金额;//这一行似乎有点不对劲…”-Tribse。哈哈,是的,我试着教自己编码,所以我会犯这样的随机错误。但我非常感谢你的帮助。谢谢:)@user2934783很讽刺的是,这个错误导致每行验证与您的预期完全相反。+1这显然是每行处理的正确方法,并且分析了这如何导致重复的最后一行(即使没有
文件.eof()
invoke(原始代码中的invoke),是一个有趣的脑力劳动者。“//文件>>日期>>金额;//那一行似乎有点不对劲……”-Tribse。哈哈,是的,我试着教自己编码,所以我会犯这样的随机错误。但我非常感谢你的帮助。谢谢:)@user2934783很讽刺的是,这个错误导致每行验证与您的预期完全相反。