簡體   English   中英

不了解.eof()如何在c ++中工作

[英]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 barfoobar之間的區別。

如果要使lletra捕獲所有空格,則需要將openFile>>lletra更改為openFile.get(lettra) >>運算符跳過空格。 如果您使用我的第一段中的鏈接中的推薦樣式,則只需要在一個位置進行此更改,而無需更改代碼中的兩個位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM