从文本转换后,二进制文件应该是什么样的?

时间:2015-07-04 17:44:51

标签: c++

问题:

  

将二进制I / O从示例代码拆分为两个:一个将普通文本文件转换为二进制文件的程序和一个读取二进制文件并转换为文本的程序。通过比较文本文件与将其转换为二进制文件并返回后获得的文件来测试这些程序。

示例代码:

#include "std_lib_facilities.h"

int main(){

    cout <<"Please enter input file name.\n";
    string name;
    cin >> name;
    // open file to read, with no byte interpretation 
    ifstream ifs(name.c_str(), ios_base::binary);
    if(!ifs) error("Can't open input file: ", name);

    cout << "Please enter output file name.\n";
    cin >> name;
    // open file to write 
    ofstream ofs(name.c_str(), ios_base::binary);
    if(!ofs) error("Can't open output file: ", name);

    vector<int> v;

    // read from binary file 
    int i;
    while(ifs.read(as_bytes(i), sizeof(int))) v.push_back(i);

    // do something with v

    // write to binary file
    for(int i = 0; i < v.size(); ++i) ofs.write(as_bytes(v[i]), sizeof(int));

    return 0;
}

这是我的代码,而不是读取和写入int值,我尝试使用字符串:

#include "std_lib_facilities.h"
void textToBinary(string, string);
//--------------------------------------------------------------------------------

int main(){

    const string info("This program converts text to binary files.\n");
    cout << info;

    const string testFile("test.txt");
    const string binaryFile("binary.bin"); 
    textToBinary(testFile, binaryFile);

    getchar();
    return 0;
}
//--------------------------------------------------------------------------------

void textToBinary(string ftest, string fbinary){
    // open text file to read
    ifstream ift(ftest);
    if(!ift) error("Can't open input file: ", ftest);

    // copy contents in vector
    vector<string>textFile;
    string line;
    while (getline(ift,line)) textFile.push_back(line);

    // open binary file to write
    ofstream fb(fbinary, ios::binary);
    if(!fb) error("Can't open output file: ", fbinary);

    // convert text to binary, by writing the vector contents
    for(size_t i = 0; i < textFile.size(); ++i){ fb.write(textFile[i].c_str(), textFile[i].length()); fb <<'\n';}

   cout << "Conversion done!\n";
}

注意:

我的文本文件包含 Lorem Ipsum ,没有数字或特殊标点符号。
使用二进制模式编写文本后,有一个完美的字符解释,源文本文件看起来很像目的地。 (我的注意事项是,当使用二进制模式和函数write(as_bytes(), sizeof())时,文本文件的内容被完美地翻译,并且没有错误。)

问题:

在使用二进制模式(无字符解释)和写入时的函数write(as_bytes(), sizeof())后,二进制文件应如何显示?

1 个答案:

答案 0 :(得分:3)

在Unix-land和Windows中,文件主要只是一个字节序列。

使用Windows NTFS文件系统(默认情况下),您可以在同一个文件中拥有多个字节序列,但总有一个主序列是普通工具看到的序列。对于普通工具,每个文件只显示一个字节序列。

C ++中的

文本模式二进制模式关注基本的i / o机制是否应翻译与外部约定。在Unix-land中没有区别。在Windows文本模式下,将换行符从内部单字节C约定(即ASCII换行,'\n')转换为外部双字节Windows约定(即ASCII回车'\r' +换行'\n'),以及反之亦然。此外,在Windows中输入时,遇到单个字节值26,&#34;控件Z&#34;,是或可以被解释为文件结尾。

关于字面问题,

  

问题是它们在二进制文件中写入的格式是什么,不应该以非解释形式写入,即原始字节?

在两种情况下,文本都被写为原始字节。区别仅在于如何将换行符转换为换行符的外部约定。 由于您的文字 1)不包含任何换行符,因此没有区别。 编辑:您的代码中未显示除了向侧面滚动之外,有一个sa fb <<'\n'向二进制模式下打开的文件输出换行符,如果这产生与原始文本文件相同的字节,则没有有效的转换,意味着你不在Windows中这样做。

关于Windows文件的额外流,它们被重新使用,例如:对于Windows(文件)资源管理器的自定义文件属性,它们可以被访问,例如通过Windows命令解释器中的错误,如下所示:

C:\my\forums\so\0306>echo This is the main stream >x.txt

C:\my\forums\so\0306>dir | find "x"
04-Jul-15  08:36 PM                26 x.txt

C:\my\forums\so\0306>echo This is a second byte stream, he he >x.txt:2nd

C:\my\forums\so\0306>dir | find "x"
04-Jul-15  08:37 PM                26 x.txt

C:\my\forums\so\0306>type x.txt
This is the main stream

C:\my\forums\so\0306>type x.txt:2nd
The filename, directory name, or volume label syntax is incorrect.

C:\my\forums\so\0306>find /v "" <x.txt:2nd
This is a second byte stream, he he

C:\my\forums\so\0306>_

我无法抗拒发布一个例子。 :)

1)您声明“我的文本文件包含 Lorem Ipsum ,没有数字或特殊标点符号”,表示没有换行符。