2013-09-06 3 views
0

Я пытаюсь подсчитать количество символов и строк в файле, используя следующую функцию.Как подсчитать символы, строки и слова в файле

void characterCount(ifstream& inf, string fName, int length []) 
{  

    int charNum = 0; 
    int lineNum = 0; 

char character; 

inf.get(character); 
while (!inf.eof()) 
{ 
    // counts a line when an endline character is counted 
    if (character = '\n') 
     ++lineNum;  

    charNum++; 
    inf.get(character); 

    if (character = EOF) 
     break; 
} 

inf.close(); 
inf.clear(); 

wordTabulate(inf, charNum, lineNum, length, fName); 
} 

void wordTabulate(ifstream& inf, int charNum, int lineNum, int count [], string fName) 
{ 
inf.open(fName); 
string word; 
while (inf >> word) 
{ 
    cout << word; 
    count[word.size()]++; 
} 

inf.close(); 
inf.clear(); 
inf.open(fName); 

output (inf, charNum, lineNum, count); 
} 

К сожалению, он будет считать только 1 строку, 1 символ и не будет классифицировать слова по размеру. Все остальные функции, которые я написал для него, работают нормально. Я пробовал множество различных вещей для счетчика персонажей, но ничего не работает. Любая помощь, которую вы могли бы предоставить, была бы весьма признательна.

Ниже я добавил функцию вывода. Я уверен, что есть лучший способ вывода из массива, но я не слишком беспокоюсь об этом прямо сейчас.

void output(ifstream& inf, int charNum, int lineNum, int count []) 
{ 
int words = 0; 
cout << "Characters: " << charNum << endl; 

words = totalWord(count); 

cout << "Words: " << words << endl; 

cout << "Paragraphs: " << lineNum << endl; 

cout << "Analysis of Words: " << endl; 

cout << "Size 1 2 3 4 5 6 7 8 9 10+" << endl; 

cout << "#Words" << count [2], count [3], count [4], count [5], 
        count [6], count [7], count [8], count [9], count [10]; 
} 

Это открытая файловая функция, которая, я считаю, является виновником.

bool fileOpen(string fileName, ifstream& inf, int wordTypes []) 
{ 
int charNum = 0; 
int lineNum = 0; 
cout << "File? >" << endl;     // asks for file name 
cin >> fileName;        

// opens file and indicates if file can be opened 
bool Repeat();        
{ 
    inf.open(fileName.c_str()); 

    if (inf.is_open()) 
    { 
     return true; 
    } 

    if (!inf.is_open()) 
    { 
     return false; 
    } 
} 
} 
+4

проблема здесь: 'если (символ = '\ п')' и 'здесь, если (символ = EOF)', вы имели в виду 'если (символ == '\ п') 'и' if (character == EOF) ' – brunocodutra

+0

Это не позволяет подсчитывать только один символ и строку, но теперь он никогда не выводится и, кажется, застревает в цикле while. – user2752575

+0

Вы проверили unix использовать wc -m/w/l для справки? – lpapp

ответ

2

Проблема в первом цикле, что вы не читаете символ в цикле, а также, что вы пытаетесь использовать eof() в качестве конечного состояния. Ничего не работает. Вам всегда нужно проверить после, считая, что вы успешно прочитали сущность, а eof() - это не то условие, которое вы ищете. Ваш цикл должен иметь состояние так:

for (char value; in.get(value);) { 
    ... 
} 

выше цикл будет читать через все символы в файл и избежать какой-либо необходимости для лечения EOF специальных. Тем не менее, я всегда люблю конструктивные решения проблемы. Вот мое:

void count(std::istream& in, int& chars, int& words, int& lines) 
{ 
    bool word(false); 
    std::for_each(std::istreambuf_iterator<char>(in), 
        std::istreambuf_iterator<char>(), 
        [&](unsigned char c) { 
         word = !std::isspace((++chars, c)) 
          && (word || ++words); 
         c == '\n' && ++lines; }); 
} 
+0

Как избавиться от цикла while, похоже, исправил мою предыдущую проблему, но теперь она, похоже, полностью пропускает цикл. – user2752575

+0

Ну, вам нужно что-то обработать персонажей! Однако он должен выглядеть как 'for'-loop, который я разместил. ... или использовать алгоритм, как в другом примере, который я дал. –

+0

Я сделал вывод каждого символа в цикле, и я обнаружил, что он проходит цикл, но не читает никаких символов. – user2752575

Смежные вопросы