2015-07-29 1 views
0

Я попытался сделать программу ранее, которая сообщает пользователю, а затем количество символов, слов и строк в текстовом файле. Я делал функции для определения номеров каждого, но я передавал их по значению. Это привело к ошибке, так как после прочтения числа символов он будет в конце файла, а затем выводит ноль для двух других. Теперь я не могу переписать свои функции так, чтобы файл был открыт и закрыт каждый раз, когда он проверяется на символ, слова и строки. Кто-нибудь видит, где мои ошибки? Благодаря! (просто скопировали и вставляли одну из моих функций на данный момент).Фиксация синтаксиса числа функций чтения строк

int num_of_lines(ifstream file) 
{ 
    string myfile; 
    myfile = argv[1]; 

    ifstream l; 
    l.open(myfile); 

    int cnt3 = 0; 
    string str; 

    while(getline(file, str))cnt3++; 
    l.close(); 

    return(cnt3); 
} 


int main(int argc, char **argv) 
{ 
    int num_of_char(ifstream file); 

    string file; 
    file = argv[1]; 

    if(argc == 1)die("usage: mywc your_file"); 

    ifstream ifs; 

    ifs.open(file); 

    if(ifs.is_open()) 
    { 
     int a, b, c; 

     a = num_of_lines(ifs); 

     cout <<"Lines: " << a << endl; 
    } 
    else 
    { 
     cerr <<"Could not open: " << file << endl; 
     exit(1); 
    } 

    ifs.close(); 

    return(0); 
} 
+1

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

ответ

0

Там нет никакого способа, чтобы «возобновить» файл, отличный, зная имя и создание нового ifstream, но вы можете использовать функцию seekg члена, чтобы установить позицию чтения в файле, и установить его в 0 будет иметь следующий запуск операции чтения с начала файла.

Поток нельзя скопировать, поэтому вы не можете передать его «по значению», но должны передать его по ссылке.

int num_of_lines(ifstream &file) 
{ 
    int count = 0; 
    string str; 

    while (getline(file, str)) { 
     count++; 
    } 
    file.seekg(0); 

    return count; 
} 

Для полной проблемы, я согласен с Матс Петерссон. Подсчет обоих символов, строк и слов за один проход будет намного более эффективным, чем чтение через файл три раза.

+1

@ Zach: Из примера Rasmus, при чтении строки, количество символов в этой строке может быть получено из длины строки. Обозначьте линию с разделителем пространства, у вас будет количество слов в строке. Это будет так просто. Накопленный этот показатель на строку и количество слов даст вам общее количество символов и количество слов в файле. – simon