0

私は今まで使ったことがありませんdirent.h。istringstream を使用してテキスト ファイル (単数) を読み取っていましたが、ディレクトリ内の複数のテキスト ファイルを読み取るようにプログラムを修正する必要がありました。これは私がdirentを実装しようとしたところですが、うまくいきません。

多分私はstringstreamでそれを使うことができませんか? お知らせ下さい。

読みやすくするために、言葉でやっているふわふわのものを取り出しました。dirent.h のものを追加するまで、これは1 つのファイルに対して完全に機能していました。

#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream>  // for istringstream
#include <fstream>
#include <stdio.h>
#include <dirent.h>

void main(){

    string fileName;
    istringstream strLine;
    const string Punctuation = "-,.;:?\"'!@#$%^&*[]{}|";
    const char *commonWords[] = {"AND","IS","OR","ARE","THE","A","AN",""};
    string line, word;
    int currentLine = 0;
    int hashValue = 0;

    //// these variables were added to new code //////

    struct dirent *pent = NULL;
    DIR *pdir = NULL; // pointer to the directory
    pdir = opendir("documents");

    //////////////////////////////////////////////////


    while(pent = readdir(pdir)){

        // read in values line by line, then word by word
        while(getline(cin,line)){
            ++currentLine;

            strLine.clear();
            strLine.str(line);

            while(strLine >> word){

                        // insert the words into a table

            }

        } // end getline

        //print the words in the table

    closedir(pdir);

    }
4

1 に答える 1

1

int main()ではなく、を使用する必要がありvoid main()ます。

への呼び出しをエラー チェックする必要がありますopendir()

cinを使用してファイルの内容を読み取るのではなく、ファイルを開く必要があります。そしてもちろん、それが適切に閉じられていることを確認する必要があります (これは、何もせずにデストラクタに処理させることによって行われる可能性があります)。

"documents"ファイル名は、ディレクトリ名 ( ) と によって返されるファイル名の組み合わせになることに注意してくださいreaddir()

おそらくディレクトリをチェックする必要があることにも注意してください(または、少なくとも、現在のディレクトリ"."".."親ディレクトリを確認してください)。

Andrew Koenig と Barbara Moo による本「Ruminations on C++」opendir()には、C++ プログラムでより適切に動作するように C++ で関数ファミリをラップする方法について説明する章があります。


ヘザーは尋ねます:

getline()の代わりに何を入れcinますか?

現時点では、コードは標準入力から読み取りますcin。つまり、プログラムを で起動すると、ディレクトリ内の内容に関係なく、ファイル./a.out < program.cppが読み取られます。program.cppしたがって、次のようにして見つけたファイルに基づいて、新しい入力ファイル ストリームを作成する必要がありますreaddir()

while (pent = readdir(pdir))
{
    ...create name from "documents" and pent->d_name
    ...check that name is not a directory
    ...open the file for reading (only) and check that it succeeded
    ...use a variable such as fin for the file stream
    // read in values line by line, then word by word
    while (getline(fin, line))
    {
         ...processing of lines as before...
    }
}

getline()最初の読み取り操作 ( を介した) は失敗するため、ディレクトリを開くだけで済む可能性があります (ただし、名前に基づいて.およびディレクトリ エントリをスキップするように調整する必要があります)。..がループ内のローカル変数である場合fin、外側のループが循環するときにfin破棄され、ファイルが閉じられます。

于 2012-04-18T00:40:41.120 に答える