[英]Don't understand how .eof () works in c++
我最近在課堂上開始使用文件。 在做作業時,我無法真正理解.eof()。
我們正在編碼的程序應該執行以下操作:該程序要求您提供文件名,將其打開,然后讀取每個字符並計算每個單詞。 最后,它顯示了單詞的平均長度。
發生的情況是:每當我打開帶有以點號結尾的文本的文件時,它都能正常工作,平均值是正確的。 但是,當文本不以點結尾時(例如:9 8 7 6 5 4 3 2 1點火),則表明沒有單詞。 我一直在互聯網上搜索,但只發現File End常量通常為-1
。 我只是想弄清楚它是如何工作的。 謝謝
代碼如下:
bool isSeparator (char lletra){ //Com que són caràcters anglesos no hem de tenir en compte els accents
//Pre: cert
//Post: retorna cert si lletra és un separador, fals altrament -- els números són entesos com separadors
bool separador = true;
if(lletra>='a' and lletra<='z')
separador = false;
else if(lletra>='A' and lletra<='Z')
separador = false;
else {
separador = true;
}
return separador;
}
void calculateNumbers (string fileName){
ifstream openFile (fileName.c_str());
char lletra; //Iniciem la primera variable
openFile>>lletra;
double wordCounter, average, wordLength, totalLength;
char auxiliar = ' ';
wordCounter = average = wordLength = totalLength = 0;
while (not openFile.eof()){ //Mentre no trobi el final, que continui mirant lletres
if (not isSeparator(lletra)){
wordLength++;
auxiliar = lletra;
} else if (isSeparator (lletra) and not isSeparator(auxiliar)){
wordCounter++;
totalLength+=wordLength;
wordLength = 0;
auxiliar = lletra;
}
openFile>>lletra;
}
cout<<setprecision(3);
cout<<fixed;
average = totalLength/wordCounter;
if (average==0){
cout<<"Mitjana longitud mot: cap mot!";
} else {
cout<<totalLength<<" "<<wordCounter<<endl;
cout<<"Mitjana longitud mot: "<<average<<endl;
}
cout<<openFile.eof();
}
有些東西在加泰羅尼亞語中。 如果有什么你不懂的就問我。
此問題說明.eof()
工作方式。
您的代碼實際上可以正確讀取文件(盡管不使用推薦的樣式)。 lletra
存儲從文件讀取的最新字符,並且一旦字符用完,就不會輸入循環主體。
您的代碼僅在遇到分隔符時使wordCounter
遞增。 因此,當文件具有時.
, wordCounter
變為1
。 如果文件沒有.
(並且沒有其他分隔符)即使文件中包含“單詞”,它也始終為0。
這使行average = totalLength/wordCounter;
除以零會導致不確定的行為。
解決此問題的方法:您可以添加邏輯,以便如果文件未以分隔符結尾,則假裝文件確實以分隔符結尾,以便將最后一個單詞視為一個單詞。 例如,循環退出后,檢查lletra
,如果它不是分隔符,則增加字計數器。
如果離散變量是整數類型而不是double
類型,那也更好。
注意 如果您實際上是按照“ word”的正常含義來計算文件中的單詞數,那么您使用的方法就沒有用,因為您無法分辨foo bar
和foobar
之間的區別。
如果要使lletra
捕獲所有空格,則需要將openFile>>lletra
更改為openFile.get(lettra)
。 >>
運算符跳過空格。 如果您使用我的第一段中的鏈接中的推薦樣式,則只需要在一個位置進行此更改,而無需更改代碼中的兩個位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.