具有意外输出的fstream

时间:2015-10-22 05:13:36

标签: c++ fstream

我需要帮助搞清楚为什么输出文件中有一些额外的符号。无论在原始文本文件中放置什么,总是有10个。 非常感谢你的时间!

"plain.txt"
  

Mus velit,tincidunt vitae in enim id egestas eget。

     

Nibh libero dignissim vitae elit。 Quisque eleifend blandit pharetra   quisque。

     

Ridiculus ac quam nisl suspendisse。 Litora。

     

Nostra扭伤urna cursus fermentum nec magnis lobortis posuere   ultricies phasellus ultricies tellus mattis massa sagittis。

     

Porta dolor aliquam iaculis。

     

Litora。 Maecenas nulla donec laoreet坐。

     认真的临时生活习惯,普通的普通生物   hendrerit。

     

Quam magna nibh sociosqu libero mi Laoreet pede vel。

     

Suspendisse eu。 Laoreet potential enim,ad。

     

Turpis augue viverra hendrerit praesent tristique velit。

     

Dapibus发表了一份简历purus nisi。

     

Pharetra molestie inceptos volutpat。 Egestas bibendum ad ipsum diam。   的Lorem。

"coded.txt"
  

QYW $ $ zipmx0 $ xmrgmhyrx $ zmxei先生$ $ irmq MH $ $ ikiwxew ikix2   Rmfl $ pmfivs $ hmkrmwwmq $ zmxei $ ipmx2 $ Uymwuyi $ ipimjirh $ fperhmx $ tlevixve $ uymwuyi2   Vmhmgypyw $如$ uyeq $ rmwp $ wywtirhmwwi2 $ Pmxsve2   Tsvxe $ hspsv $ epmuyeq $ megypmw2 Pmxsve2 $ Qeigirew $ ryppe $ hsrig $ pesviix $ wmx2   Gsrkyi $ xiqtsv $ lefmxewwi0 $ typzmrev $ tyvyw $ IVEX $ tvsmr $ $阿尔西$ lirhvivmx lirhvivmx2   Uyeq $ qekre $ rmfl $ wsgmswuy $ pmfivs $ QM $ Pesviix $ tihi $ ZIP2   Wywtirhmwwi $ IY2 $ Pesviix $ tsxirxm $ irmq0 $ EH2   Xyvtmw $ eykyi $ zmzivve $ lirhvivmx $ tveiwirx $ xvmwxmuyi $ zipmx2   Hetmfyw $ YX $ E $ xsvxsv $ zmxei $ tyvyw $ rmwm2   Tlevixve $ qspiwxmi $ mrgitxsw $ zspyxtex2 $ Ikiwxew $ fmfirhyq $诶$ mtwyq $ hmeq2 $ Psviq2Qyw $ zipmx0 $ xmrgmhyrx $ zmxei $ $先生$ irmq MH $ ikiwxew $ ikix2   Rmfl $ pmfivs $ hmkrmwwmq $ zmxei $ ipmx2 $ Uymwuyi $ ipimjirh $ fperhmx $ tlevixve $ uymwuyi2   Vmhmgypyw $如$ uyeq $ rmwp $ wywtirhmwwi2 $ Pmxsve2   Tsvxe $ hspsv $ epmuyeq $ megypmw2   Pmxsve2 $ Qeigirew $ ryppe $ hsrig $ pesviix $ wmx2   Gsrkyi $ xiqtsv $ lefmxewwi0 $ typzmrev $ tyvyw $ IVEX $ tvsmr $ $阿尔西$ lirhvivmx lirhvivmx2   Uyeq $ qekre $ rmfl $ wsgmswuy $ pmfivs $ QM $ Pesviix $ tihi $ ZIP2   Wywtirhmwwi $ IY2 $ Pesviix $ tsxirxm $ irmq0 $ EH2   Xyvtmw $ eykyi $ zmzivve $ lirhvivmx $ tveiwirx $ xvmwxmuyi $ zipmx2   Hetmfyw $ YX $ E $ xsvxsv $ zmxei $ tyvyw $ rmwm2   Tlevixve $ qspiwxmi $ mrgitxsw $ zspyxtex2 $ Ikiwxew $ fmfirhyq $ eh $ mtwyq $ hmeq2 $ Psviq2 ムムムムムムムムムム 2号后面的这些符号不应该在这里。

#include <iostream>
#include <fstream>

using namespace std;

const char FILEIN[] = "plain.txt";
const char FILEOUT[] = "coded.txt";

int main()
{
    ifstream inFile;
    ofstream outFile;


    inFile.open(FILEIN);
    outFile.open(FILEOUT);

    if (inFile.is_open() && outFile.is_open())
    {
        inFile.seekg (0, inFile.end);
        int size = inFile.tellg();
        inFile.seekg (0, inFile.beg);
        cout << size << endl;
        char * block = new char[size];

        inFile.read(block, size);
        for (int i = 0; i < size; ++i)
            if (block[i] != '\n') block[i] += 4;
        outFile.write(block, size);

        cout << endl << "File encrypted" << endl;
        inFile.close(); outFile.close();
    }
    else cout << "Unable to access files" << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:0)

使用ifstream::read读取文件内容时,需要以二进制模式打开文件。同样,当您使用ofstream::write写入文件时,也需要以二进制模式打开文件。

inFile.open(FILEIN, std::ios::bin);
outFile.open(FILEOUT, std::ios::bin);

这对于处理各种平台处理换行符的不同方式是必要的。

size返回一个数字,其中包含每个换行符的两个字符。但是,当读取数据时,两个字符仅作为一个字符读入。如果您有一行文件,例如:

test

size的值为6.数据准备就绪后,第五个字符为'\n',第六个字符为垃圾。当写出来时,输出将有那个垃圾。