2013-12-13 4 views
0

Я изучаю C++, и сейчас я создал файл, который выполняет некоторые шифрования/дешифрования. После того как я закончил со всем, я хочу узнать, насколько файл сжат/распакован. Поэтому я решил подсчитать символы во входном и выходном файлах, но вот где он начинает идти не так.Подсчет символов в txt-файле, дающий неверный счет

int get_compression(string file1, string file2){ 
    string line = ""; 
    ifstream stream1(file1.c_str()); 
    double counter1 = 0.0; 
    while(getline(stream1, line)){ 
     counter1 += line.length(); 
    } 
    stream1.close(); 

    cout << counter1 << "\n"; 

    ifstream stream2(file2.c_str()); 
    double counter2 = 0.0; 
    while(getline(stream2, line)){ 
     counter2 += line.length(); 
    } 
    stream2.close(); 

    cout << counter2 << "\n"; 

    return (counter2/counter1)*100; 
} 

Я добавил два cout заявления, чтобы увидеть, что он рассчитывал, но он говорит мне, что насчитал 496 символов во входном текстовом файле, который действительно имеет 528 символов, и 481 символов в текстовом файле, который имеет 785 символов. Я где-нибудь совершил ошибку?

+1

'getline' отбрасывается конца-строки символов. Это может быть два символа на операционных системах. Для надежного подсчета используйте 'fstat'. – usr2564301

+0

@Jongware Мне было бы неплохо, если бы счет был отключен двумя символами, но он отключен несколькими сотнями с моим выходным txt-файлом. – Chronicle

+2

Вам также нужно будет открыть файл в двоичном режиме, так как если в текстовом режиме вы получите некоторые автоматические переводы, скрывающие байты. – RichardPlunkett

ответ

0

Я считаю, что вы не считаете новых символов линии. В Windows это может произойти по 2 символа на строку ошибки. Поэтому я предлагаю вам посмотреть, сколько строк содержит каждый файл и добавлено к тому, что подсчитал ваш код.

+0

На самом деле не« на Windows », поскольку входной файл может происходить из другой ОС - или, в качестве альтернативы, он был создан с помощью инструмента, который не заботится только о Windows» cr/lf "конец строки. – usr2564301

+1

Совершенно верно ... Я хотел сказать для Windows, созданных текстовыми файлами ... – Trimtab

0

Другие ответы и комментарии совершенно точны, но вы можете попробовать использовать Boost Fileystem, потому что это упрощает такие вещи.

Это пример, взятый из документации повышающего в http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/tutorial.html#Reporting-size

#include <iostream> 
#include <boost/filesystem.hpp> 
using namespace boost::filesystem; 

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    { 
    std::cout << "Usage: tut1 path\n"; 
    return 1; 
    } 
    std::cout << argv[1] << " " << file_size(argv[1]) << '\n'; 
    return 0; 
} 
Смежные вопросы