c++ - 如何将包含数字的文本文件转换为二进制文件?

标签 c++ windows binary iostream fstream

所以我制作了一个使用 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;
};

最佳答案

OutputFile.write((char*)InputFile.get(), sizeof(InputFile));

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

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

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

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));

上面的代码片段适用于这样的输入文本文件:-4 21 1990 5425342 -3432 0 100

关于c++ - 如何将包含数字的文本文件转换为二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11632679/

相关文章:

c++ - mxnet 使用 intel mkl 构建总是抛出错误 "Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll."

c++ - 存在错误代码时的输出参数与 NRVO

mysql - 开发环境Windows/Ubuntu切换

windows - 将 TortoiseHg 移植为使用 Git 是否容易?

file - 在 Swift 中,如何将现有二进制文件读入数组?

c++ - Qt WebEngine 打印时不正确的页边距

c++ - 在运算符重载中使用 throw 来处理异常 (C++)

windows - 为什么没有 64 位版本的 R for Windows?

c - 重用已编译的 .exe 文件中的字符

java - 如何在java中将二进制字符串转换为2个字节的字节数组