从文件中读取字符串并转换为bitset< 12>

时间:2017-04-12 23:32:30

标签: c++ binaryfiles bitset

您好我试图从txt文件中读取字符串并将其转换为二进制文件,该文件是bitset< 12>字符串形式。

int main()
{
using namespace std;

std::ifstream f("fruit.txt");
std::ofstream out("result.txt");

std::hash<std::string>hash_fn;

int words_in_file = 0;
std::string str;
while (f >> str){
    ++words_in_file;
    std::bitset<12>* bin_str = new std::bitset<12>[3000];
    int temp_hash[sizeof(f)];
    std::size_t str_hash = hash_fn(str);
    temp_hash[words_in_file] = (unsigned int)str_hash;
    bin_str[words_in_file] = std::bitset<12>((unsigned int)temp_hash[words_in_file]);
    out << bin_str[words_in_file] << endl;
    delete[] bin_str;
}
out.close();
}

但有错误。我怎样才能改变它?

1 个答案:

答案 0 :(得分:1)

以下是我编写的一些代码,用于将输入文件"file.txt"转换为二进制文件。它通过获取每个字符的ascii值并将该数字表示为二进制值来实现,尽管我不确定如何在此处将bin_str写入文件。

#include <string>
#include <fstream>
#include <streambuf>
#include <bitset>
#include <iostream>

int main(){
    std::ifstream f("file.txt");
    std::string str((std::istreambuf_iterator<char>(f)),
                    std::istreambuf_iterator<char>());  // Load the file into the string
    std::bitset<12> bin_str[str.size()]; // Create an array of std::bitset that is the size of the string

    for (int i = 0; i < str.size(); i++) {
        bin_str[i] = std::bitset<12>((int) str[i]); // load the array
        std::cout << bin_str[i] << std::endl; // print for checking
    }
}

侧面注意:

std::bitset<12>可能不是你想要的,如果你查看ascii字符,你可以拥有的最高数字是127,而二进制文件中只有7位数,所以我假设你&#39 ; d想要更像std::bitset<7>std::bitset<8>

的内容 编辑:

如果要将其写入文件,则需要使用std::ios::binary打开文件,然后循环遍历位集数组并编写从to_ulong()给出的无符号长代表,作为const char指针((const char*)&ulong_bin)。现在,当您使用二进制编辑器打开文件时,您将看到二进制写入和常规写入之间的区别,但您会注意到cat之类的程序仍然可以破译您编写的二进制文件简单的ascii字母。

std::ofstream out("file.bin", std::ios::binary);
for (int i = 0; i < str.size(); i++) {
    unsigned long ulong_bin = bin_str[i].to_ulong();
    out.write((const char*)&ulong_bin, sizeof(ulong_bin));
}

编辑:归功于@PeterT

我注意到C ++ 11及更高版本不支持VLA,可变长度数组,所以行std::bitset<12> bin_str[str.size()];应该更改为以下之一:

std::bitset<12> *bin_str = new std::bitset<12>[str.size()]; // make sure you delete it later
// OR
std::vector<std::bitset<12>> bin_str(str.size());
// OR
std::unique_ptr<std::bitset<12>[]> str_ptr (new std::bitset<12>[str.size()]);