我编辑了一段代码,用于从.txt文件中读取整数并使用cout显示它们。它被设计为显示第一个整数,后跟逗号,然后是.txt中存在空行或整数整数的问题的运行总平均值。我被建议将代码更改为:
using namespace std;
# include <iostream>
#include <fstream>
#include<string>
int main ()
{
double y = 0,x = 0,value1 =0;
string myFileName,myString;
cout<< "please enter the name of the file you wish to open"<<"\n";
cin>>myFileName;
ifstream inFile;
inFile.open(myFileName.c_str());
while (!inFile.eof())
{
double currentAv;
//while(getline(inFile,myString,(' ')))
while(inFile>>value1)
{
y=y+1;
//value1 = atof(myString.c_str());
currentAv=(value1+x)/y;
cout<<value1<<","<<currentAv<<endl;
x=value1+x;
}
}
inFile.close();
system("pause");
}
取出带有//的2行,将while循环更改为:
while(inFile>>value1)
问题是我需要了解新代码与旧代码的不同之处。有人可以帮忙吗?我知道它会改变位,但我不明白为什么会这样。代码确实有效。
答案 0 :(得分:0)
让我们一步一步看看发生了什么。
inFile>>value1
这将调用istream::operator>>,它从流中读取double
并返回对流对象的引用,即inFile
本身。
while(inFile>>value1)
while
语句的条件必须可转换为bool
。现在我们知道inFile>>value1
的类型是std::istream&
,实际上存在istream::operator bool
,如果没有设置错误标志,则返回true
(这意味着最后一次读取手术没有成功)。
因此,while(inFile>>value1)
的整体含义是:value1
从inFile
读取getline
。
与atof
加>>
相比的差异。首先,{{1}}读取直到任何空格字符,而不仅仅是代码中的空格。其次,无效输入会失败。第三,它更具惯用性。