2012-04-17 6 views
0

Я раньше не использовал dirent.h. Я использовал istringstream для чтения текстовых файлов (в единственном числе), но вам нужно было попробовать пересмотреть программу для чтения в нескольких текстовых файлах в каталоге. Здесь я попытался реализовать dirent, но он не работает.Новое на <dirent.h>, пытаясь получить доступ к данным в каталоге

Возможно, я не могу использовать его со строкой? Пожалуйста, порекомендуйте.

Я достал пушистый материал, который я делаю со словами для удобочитаемости. Это был отлично работает для одного файла, пока я не добавил материал 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 = "-,.;:?\"'[email protected]#$%^&*[]{}|"; 
    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); 

    } 
+0

Обратите внимание, что 'void main()' не является одним из допустимых прототипов для основной программы в C++ (и является нестандартным в C). –

+0

привет, мне очень жаль, я не знал об этом! Вернулись и исправили это. Спасибо за головы :) –

ответ

1

Вы должны использовать int main() и не void main().

Ошибка при вызове opendir().

Чтобы прочитать содержимое файла, вам нужно будет открыть файл вместо cin. И, конечно же, вам нужно будет убедиться, что он закрыт надлежащим образом (что может быть, ничего не делая и позволяя деструктору делать свои вещи).

Обратите внимание, что имя файла будет представлять собой комбинацию имени каталога ("documents") и имя файла, возвращаемое readdir().

Обратите внимание, что вы должны, вероятно, проверить каталоги (или, по крайней мере, для "." и "..", текущих и родительских каталогов).

В книге "Ruminations on C++" от Andrew Koenig и Barbara Moo есть глава, в которой обсуждается, как обернуть семейство функций 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, который должен закрыть файл.

+0

ОК, поэтому я изменил void на int (не уверен, почему я сделал это в первую очередь tbh.), а также проверили ошибки. Справочные «документы» верны, раньше я работал над этим, просто распечатывая имена документов. Поэтому я считаю, что это правильно. Итак, я смущен, что я поставил в getline() вместо cin? Меня это очень смущает. –