我有一个文本文件,包含0,..,2 ^ 32-1范围内的无符号整数。 每行包含一个整数(和换行符char)。
我想将其写入二进制文件以节省空间(这样每个int将占用4个字节)。什么是最好的方法呢?
我尝试了一些选项,但似乎都没有。将不胜感激。
当前(非工作)代码:
#include <fstream>
#include <iostream>
#include <stdio.h>
int main(){
int x;
while (std::cin >> x){
fwrite((void*)&x, sizeof(x), 1, stdout);
}
return 0;
}
使用以下方法编译:
g++ compress.cc -o compress
。
但是,它似乎只输出第一个整数。
例如,让我运行命令./compress < bla | wc -c
哪里&#34; bla&#34;是一个包含
的文件1864754174
2150244390
1703231727
该命令的结果为4
,而不是我预期的12
。
答案 0 :(得分:3)
你的问题是你正在尝试编写int而不是unsigned int。 这两者之间的差异不是它们的大小,而是使用字节。
in unsigned int每个位reprsent 2 ^(索引-1)索引从1开始。
在int中,这些位用作unsiged int,只是最后一位用于表示数字的符号,因为你可以代表较小的数字。
答案 1 :(得分:0)
如果我理解正确,你想从包含uints的文本文件中读取并将它们写入二进制文件。 读:
std::vector<unsigned int> readUints(const std::string& filepath){
std::vector<unsigned int> numbers;
std::ifstream file(filepath);
if(!file.is_open()){
//Handle file not found
}
unsigned int number = 0;
while(file >> number){
numbers.push_back(number);
}
return numbers;
写作:
void writeUints(const std::vector<unsigned int>& numbers, const std::string& filepath){
std::ofstream file(filepath, ios_base::binary | ios_base::out);
if(!file.is_open()){
//Handle file not found
}
for(int i = 0; i < numbers.size(); i++){
file.write(reinterpret_cast<char*>(&numbers[i], 4);
}
}
确保包含<fstream>
。您可以将unsigned int
更改为uint32_t
,以确保它在每个平台上都是32位宽