具有意外输出的 fstream

fstream with unexpected output

我需要帮助来弄清楚为什么输出文件中有一些额外的符号。无论在原始文本文件中放入什么,它们总是有 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 torquent urna cursus fermentum nec magnis lobortis posuere ultricies phasellus ultricies tellus mattis massa sagittis.

Porta dolor aliquam iaculis.

Litora. Maecenas nulla donec laoreet sit.

Congue tempor habitasse, pulvinar purus erat proin ante hendrerit hendrerit.

Quam magna nibh sociosqu libero mi Laoreet pede vel.

Suspendisse eu. Laoreet potenti enim, ad.

Turpis augue viverra hendrerit praesent tristique velit.

Dapibus ut a tortor vitae purus nisi.

Pharetra molestie inceptos volutpat. Egestas bibendum ad ipsum diam. Lorem.

"coded.txt"

Qyw$zipmx0$xmrgmhyrx$zmxei$mr$irmq$mh$ikiwxew$ikix2 Rmfl$pmfivs$hmkrmwwmq$zmxei$ipmx2$Uymwuyi$ipimjirh$fperhmx$tlevixve$uymwuyi2 Vmhmgypyw$eg$uyeq$rmwp$wywtirhmwwi2$Pmxsve2 Tsvxe$hspsv$epmuyeq$megypmw2 Pmxsve2$Qeigirew$ryppe$hsrig$pesviix$wmx2 Gsrkyi$xiqtsv$lefmxewwi0$typzmrev$tyvyw$ivex$tvsmr$erxi$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$Psviq2Qyw$zipmx0$xmrgmhyrx$zmxei$mr$irmq$mh$ikiwxew$ikix2 Rmfl$pmfivs$hmkrmwwmq$zmxei$ipmx2$Uymwuyi$ipimjirh$fperhmx$tlevixve$uymwuyi2 Vmhmgypyw$eg$uyeq$rmwp$wywtirhmwwi2$Pmxsve2 Tsvxe$hspsv$epmuyeq$megypmw2 Pmxsve2$Qeigirew$ryppe$hsrig$pesviix$wmx2 Gsrkyi$xiqtsv$lefmxewwi0$typzmrev$tyvyw$ivex$tvsmr$erxi$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ムムムムムムムムムム These symbols after number 2 are not supposed to be here.

#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;
}

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

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

这是处理各种平台处理换行符的不同方式所必需的。

size returns 每个换行包含两个字符的数字。然而,当读取数据时,这两个字符仅作为一个字符读入。如果你有一个只有一行的文件,比如:

test

size的值为6,当数据准备好后,第五个字符为'\n',第六个字符为垃圾。写完后,输出将有垃圾。