0

我以前从未使用dirent.h过。我正在使用 istringstream 读取文本文件(单数),但需要尝试修改程序以读取目录中的多个文本文件。这是我尝试实现 dirent 的地方,但它不起作用。

也许我不能将它与字符串流一起使用?请指教。

为了便于阅读,我已经去掉了我用单词做的蓬松的东西。这对一个文件非常有效,直到我添加了 dirent.h 的东西。

#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()

还要注意,您可能应该检查目录(或者,至少, for "."and "..",当前目录和父目录)。

Andrew Koenig 和 Barbara Moo所著的“Ruminations on C++”一书中有一章讨论了如何在 C++ 中封装opendir()函数族,以使它们在 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...
    }
}

您可能只需打开目录就可以逃脱惩罚,因为第一次读取操作 (via ) 将失败(但您可能应该根据其名称getline()安排跳过.和目录条目)。..如果fin是循环中的局部变量,那么当外循环循环时,fin将被销毁,这应该关闭文件。

于 2012-04-18T00:40:41.120 回答