[英]Read a file containing unsigned ints and write it into binary in C++
我有一个文本文件,其中包含0,..,2 ^ 32-1范围内的无符号整数。 每行包含一个整数(和换行符)。
我想将其写入二进制文件以节省空间(这样每个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
./compress < bla | wc -c
其中“ bla”是包含以下内容的文件
1864754174
2150244390
1703231727
命令的结果是4
,而不是我期望的12
。
您的问题是您试图写int而不是unsigned int。 这两个之间的差异不是它们的大小,而是字节的使用。
in unsigned int每一位代表从1开始的2 ^(index -1)索引。
在int中,这些位的使用方式与未在int中使用的int一样,只是最后一位用于表示该数字的符号,因为它可以表示较小的数字。
如果我对您的理解正确,则希望从包含uint的文本文件中读取并将其写入二进制文件。 读:
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位
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.