2013-12-13 91 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个字符输入的txt文件,真正具有528个字符,并在txt文件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 Filesystem,因为它让事情变得如此简单。

这是在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; 
} 
相关问题