【问题标题】:How can I convert a text file with numbers in it into a binary file?如何将包含数字的文本文件转换为二进制文件?
【发布时间】:2012-07-24 14:07:43
【问题描述】:

所以我制作了一个使用 ifstream 打开文本文件的程序。现在我想做它,所以它以二进制输出这个文件。我尝试过 ofstream 并使用 .write() 但是当我这样做时程序崩溃了。正如我在网上看到的那样,我在使用 .write() 时正确设置了它,但我还没有看到有人用我正在使用的东西来做它。有人对此有解决方案吗?另外,我不知道为什么'InputFile'和'OutputFile'都像这样突出显示为蓝色。

#include <iostream>
#include <fstream>
#include <string>
#include <bitset>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        cout << "Error 1";
        return 0;
    }
    else
    {
        int WIDTH, HEIGHT;
        ifstream InputFile;
        InputFile.open(argv[1], ios::in);
        ofstream OutputFile;
        OutputFile.open("OUTPUT.raw", ios::binary | ios::app);
        cout << "Enter Width" << endl;
        WIDTH = cin.get();
        HEIGHT = WIDTH;
        for (int x = 0; x < WIDTH; x++)
        {
            for (int y = 0; y < HEIGHT; y++)
            {
                OutputFile.write((char*)InputFile.get(), sizeof(InputFile));
            }
        }
    }
    //cout << bitset<8>(txt[i]);
    return 0;
};

【问题讨论】:

  • 我们需要更多信息。你是怎么设置的?它是如何崩溃的,在哪里崩溃?
  • 可能,如果您显示失败的代码,我们可以提供帮助。
  • 您是否使用了ios::out | ios::binary 标志?给我们看一些代码。
  • 你能显示使用你尝试过的代码吗?
  • 如果您还显示一个示例输入文件会很好。

标签: c++ windows binary iostream fstream


【解决方案1】:
OutputFile.write((char*)InputFile.get(), sizeof(InputFile));

首先,istream::get() 从流中提取一个字符并返回其转换为整数的值。结果是一个临时的,您将其转换为指向 char 的指针!它可以编译,因为 C 风格的转换基本上告诉编译器“嘘,我知道我在做什么!”,但它肯定会在运行时做一些奇怪的事情。您需要获取存储要写入的值的某个对象的地址,然后转换该地址。

第二件事,sizeof(InputFile) 返回管理文件流的ifstream 类的大小。它与流缓冲区中有多少数据没有任何关系。

如果您以文本模式打开流,则从中提取数据的正确方法是使用提取运算符 (&gt;&gt;)。那么就很简单了:

std::ifstream in_file("numbers.txt");
std::ofstream out_file("numbers.bin", std::ios::binary);

int i;

while (in_file >> i)
    out_file.write(reinterpret_cast<char*>(&i), sizeof(int));

上面的 sn-p 将使用这样的输入文本文件:-4 21 1990 5425342 -3432 0 100

【讨论】:

  • 到目前为止,您是最接近的,但问题是我的文件在数字中没有任何空格。当我放入一个像您这样具有拆分数字的文件时,它可以工作,但是当我将我的文件放入一个大数字时,由于某种原因它无法工作。
  • 我会向您展示输入文件,但在此站点上放置的字符太多。它几乎只是一个数字很大的文件。
  • 如果你想将那个“大数”表示为一个整数,那么问题就很重要了。你需要一个可以处理任意大整数的库。
  • 你想达到什么目的?如果您只想拥有具有相同信息但尺寸较小的文件版本,您可以尝试压缩它。您可以使用现有的压缩算法,或者,如果您的输入文件具有某些无法被利用的特征,您可以自己发明一些东西。
【解决方案2】:

您必须解析文本文件以获取文件中每个字符串的int,然后创建一个新文件并使用fputc()fwrite() 函数写入二进制数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 2023-03-20
    • 2014-05-30
    • 1970-01-01
    • 2014-07-30
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多