二进制文件I / O问题

时间:2009-07-29 03:01:22

标签: c++ binary

编辑:我正在尝试将文本文件转换为字节。我不确定代码是否将其转换为字节。这是标题的链接,因此您可以看到as_bytes函数。

link

#include "std_lib_facilities.h"

int main()
{
    cout << "Enter input file name.\n";
    string file;
    cin >> file;
    ifstream in(file.c_str(), ios::binary);

    int i;
    vector<int> bin;

    while(in.read(as_bytes(i), sizeof(int)))
        bin.push_back(i);

    ofstream out(file.c_str(), ios::out);

    for(int i = 0; i < bin.size(); ++i)
            out << bin[i];

    keep_window_open();
}

注意,现在out流只输出向量的内容。它不使用写入功能或二进制模式。这会将文件转换为一大行数字 - 这就是我要找的吗?

以下是第二个代码的文件转换示例:

that guy likes to eat lots of pie (not sure if this was exact text)

转向

543518319544825700191924850016351970295432362115448292821701667182186922608417526375411952522351186935715718643976841768956006

1 个答案:

答案 0 :(得分:2)

您的第一个方法未更改文件的原因是因为所有文件都以相同的方式存储。文本文件和二进制文件之间唯一的“区别”是文本文件只包含可以显示为ASCII字符的字节,而二进制文件*具有更多随机变量和字节顺序。所以你以字节为单位读取字节,然后再将它们作为字节输出!

*我将Unicode文本文件包含为二进制文件,因为它们可以有多个字节来表示一个字符点,具体取决于字符点和使用的编码。

第二种方法也很简单。您正在读取字节,如前所述,并将它们存储为整数(可能长度为4个字节)。然后你只是将整数打印出来就好像它们是整数一样,所以你看到一串数字。

至于为什么你的第一个方法切断了一些字节,你就是对的,因为它可能是你代码中的一些错误。我认为在这种情况下解释一下这些想法更重要,而不是调试一些测试代码。