2015-09-09 10 views
2

Следующий код должен рассчитывать: строки, символы и слова, считанные из текстового файла.Подсчет строк из ввода файла?

Входной текстовый файл:

This is a line. 

This is another one. 

Нужный выход:

Words: 8 

Chars: 36 

Lines: 2 

Однако количество слов выходит на 0, и если я изменить его, то линии и персонажи выходят на 0 и число слов правильное. Я получаю это:

Words: 0 

Chars: 36 

Lines: 2 

Это мой код:

#include<iostream> 
#include<fstream> 
#include<string> 

using namespace std; 


int main() 
{ 
    ifstream inFile; 
    string fileName; 


    cout << "Please enter the file name " << endl; 
    getline(cin,fileName); 
    inFile.open(fileName.c_str()); 

    string line; 
    string chars; 
    int number_of_lines = 0; 
    int number_of_chars = 0; 

while(getline(inFile, line)) 
    { 
     number_of_lines++; 
     number_of_chars += line.length(); 
    } 

    string words; 
    int number_of_words = 0; 

while (inFile >> words) 
    { 
     number_of_words++; 
    } 

    cout << "Words: " << number_of_words <<"" << endl; 
    cout << "Chars: " << number_of_chars <<"" << endl; 
    cout << "Lines: " << number_of_lines <<"" << endl; 

    return 0; 
} 

Любое руководство будет высоко оценен.

+4

'while (getline (inFile, line))' съел весь файл. Перематывайте или закрывайте и снова открывайте перед 'while (inFile >> words)' – user4581301

+2

Вам нужно будет либо 1. закрыть, либо снова открыть файл 2. использовать 'stringstream', чтобы узнать, сколько слов в каждой строке. – crashmstr

+3

Использование 'stringstream' для получения слов в строке, вероятно, более полезно в долгосрочной перспективе. – crashmstr

ответ

2

И потому, что комментарии часто непрочитанный ответа убежища ...

while(getline(inFile, line)) 

Читает через весь файл , Когда это сделано inFile «прочитаем место устанавливается в конец файла и цикл подсчета слов

while (inFile >> words) 

начинается чтение в конце файла и не находит ничего. Наименьшее изменение кода, чтобы заставить его выполнить правильно, - использовать seekg перемотать файл перед подсчетом слов.

inFile.seekg (0, inFile.beg); 
while (inFile >> words) 

Позиции расположение считывания в файл смещение 0 относительно начала файла (указанный inFile.beg), а затем считывает через файл для подсчета слов.

Хотя это работает, для этого требуется два полных чтения через файл, что может быть довольно медленным. Лучший вариант, предложенный crashmstr в комментариях и реализованный simplicis veritatis в качестве другого ответа, требует одного чтения файла для получения и подсчета строк, а затем итерации по каждой строке в ОЗУ для подсчета количества слов.

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

+0

их просто слишком много, чтобы читать, извините – Ziezi

+2

@simplicisveritatis Согласен. Ergo этот ответ. – user4581301

1

Вот одна из возможных реализаций (не проверено) использовать в качестве ориентира:

int main(){ 

// print prompt message and read input 
cout << "Please enter the file name " << endl; 
string fileName; 
getline(cin,fileName); 

// create an input stream and attach it to the file to read 
ifstream inFile; 
inFile.open(fileName.c_str()); 

// define counters 
string line; 
string chars; 
int number_of_lines = 0; 
int number_of_chars = 0; 
vector<string> all_words; 

do{ 
    getline(inFile, line); 
    // count lines 
    number_of_lines++; 
    // count words 
    // separates the line into individual words, uses white space as separator 
    stringstream ss(line); 
    string word; 
    while(ss >> word){ 
     all_words.push_back(word); 
    } 
}while(!inFile.eof()) 
// count chars 
// length of each word 
for (int i = 0; i < all_words.size(); ++i){ 
    number_of_chars += all_words[i].length(); 
} 

// print result 
cout << "Words: " << all_words.size() <<"" << endl; 
cout << "Chars: " << number_of_chars <<"" << endl; 
cout << "Lines: " << number_of_lines <<"" << endl; 

return 0; 
} 
Смежные вопросы