如何在C ++中读取/写入字节/位到新文件

时间:2016-05-25 05:39:13

标签: c++ compression

我的第一篇文章很好地坚持引导线尽我所能!

我基本上试图在二进制级别上创建一个编辑文件的方法。我有办法读取字节(不幸的是不是大格式)但我仍然坚持如何将字节写入新文件。我想我可以将字节转换为十六进制,然后以这种方式写入文件,但它的另一个步骤就像要避免。有没有一种方法可以将字节写入您可以建议的文件?如果可能的话,也允许它以5gb等大格式写入。

以下是用于将任何文件转换为字节的代码:

#include "stdafx.h"
#include <iostream>  
#include <fstream>
using namespace std;

//Variables
const unsigned long long size = 64ULL * 1024ULL * 1024ULL;
unsigned long long file[size];

class ByteManager
{
    char const* input;
public:
    void set_values(char const*);
    char* ConvertToBytes()
    {
        ifstream streamData(input);
        streamData.seekg(0, ios::end);
        size_t len = streamData.tellg();
        char* Bytes = new char[len];
        streamData.seekg(0, ios::beg);
        streamData.read(Bytes, len);
        streamData.close();

        return Bytes;
        //return 0;     
    }
};

void ByteManager::set_values(char const* a)
{
    input = a;
};

注意:我可以发布十六进制类,如果这实际上是最好的方法。

还要提前感谢提交的任何建议/反馈/代码! 〜nobodyshome

2 个答案:

答案 0 :(得分:0)

  1. 如果您打算在内存中进行压缩,并且可用内存量是一个问题,那么问题比创建输出文件时更早启动:您需要适合输入文件在记忆中!
  2. 只是制作一个文件的副本很容易而且不是内存密集型的:你只需创建一个循环来从输入文件中读取一大块数据(例如一个字节),然后立即将相同的数据块写入输出文件。因此,如果选择一个小块,内存素材可能会非常低。
  3. 您现在没有提到的另一个问题是写入磁盘的速度。以更大的块写入通常更快(但由于操作系统和存储设备本身的各种缓存/缓冲活动,这不是那么明显(至少不是线性的)。

答案 1 :(得分:0)

您正在将整个文件读入内存。在伪代码中:

bytes = read_whole_file();

你可能想一次只读一下。

while (file_has_more_bytes)
{
  byte = read_one_byte_from_file();
  do_something_with(byte);
}

但是我猜你的压缩算法想要一次知道所有的字节。您可以考虑使用多次传递方法,通读一次以获得所需的统计数据,然后再次阅读以进行实际处理。