<dirent.h>的新手,试图访问目录</dirent.h>中的数据

时间:2012-04-17 23:32:12

标签: c++ directory opendir istringstream dirent.h

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

也许我不能将它与stringstream一起使用?请指教。

我已经把我正在做的蓬松的东西拿出来用于提高可读性。这个 完美地适用于一个文件,直到我添加了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);

    }

1 个答案:

答案 0 :(得分:1)

您应该使用int main()而不是void main()

您应该错误地检查对opendir()的调用。

您需要打开文件而不是使用cin来读取文件的内容。当然,你需要确保它被适当地关闭(可能是什么都不做,让析构函数做它的东西)。

请注意,文件名将是目录名("documents")和readdir()返回的文件名的组合。

另请注意,您应该检查目录(或者至少是"."".."目录和父目录。

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...
    }
}

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