0

それぞれ異なる単語を含む 4 セットのテキスト ファイルがあります。

noun.txt には 7 つの単語が含まれます Article.txt には 5 つの単語が含まれます verb.txt には 6 つの単語が含まれ、Preposition.txt には 5 つの単語が含まれます

以下のコードでは、2 番目の for ループ内で、カウントの配列が、どのファイルから何語を読み込んだかを追跡しています。たとえば。count[0] は 5 つの世界である必要がありますが、count[1] は 8 語ですが、7 である必要があります。テキスト ファイルを確認するために戻ったところ、間違いはありませんでした。7 語です。これは ifstream の動作に問題がありますか?

また、 eof() は良い習慣ではないと言われました。データを正確に読み取るという点で、業界でのベストプラクティスは何ですか? つまり、 !infile.eof() 以外に使用できるより良いものはありますか?

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cctype>
#include <array> // std::array

using namespace std;

const int MAX_WORDS = 100;

class Cwords{
    public:
        std::array<string,4> partsOfSpeech;
};

int main()
{
    Cwords elements[MAX_WORDS];

   int count[4] = {0,0,0,0};

   ifstream infile;

    string file[4] = {"Article.txt",
                      "Noun.txt",
                      "Preposition.txt",
                      "verb.txt"};

    for(int i = 0; i < 4; i++){
        infile.open(file[i]);
        if(!infile.is_open()){
            cout << "ERROR: Unable to open file!\n";
            system("PAUSE");
            exit(1);
        }

        for(int j = 0;!infile.eof();j++){
            infile >> elements[j].partsOfSpeech[i];
            count[i]++;
        }

        infile.close();
    }

    ofstream outfile;
    outfile.open("paper.txt");

    if(!outfile.is_open()){
        cout << "ERROR: Unable to open or create file.\n";
        system("PAUSE");
        exit(1);
    }



    outfile.close();
    system("PAUSE");
    return 0;
}
4

3 に答える 3

3

データを適切に読み取るための簡単な答えは次のとおりです。読み取り操作が成功したことを読み取り後に常にテストします。このテストには、の使用は含まれませ(読む前に の使用を教えている本は、すぐに燃やす価値があります)。eof()eof()

ファイルを読み取るためのメイン ループは、次のようになります。

for (int j = 0; infile >> elements[j].partsOfSpeach[i]; ++j){
    ++count[i];
}

ところで、言語は「++C」ではなく「C++」と呼ばれていますが、式の結果を実際に使用しない限り、ポストインクリメントを使用しないでください。ほとんどの場合、問題にはなりませんが、場合によっては問題になります。ポストインクリメントは、プレインクリメントよりも大幅に遅くなる可能性があります。

于 2013-08-12T21:16:09.323 に答える
0

テキスト ファイルの末尾に余分なスペースや改行がないことを確認しましたか? eof最後の余分な「単語」は、到達する前の末尾の文字が原因である可能性があります。

于 2013-08-12T20:26:07.870 に答える