读取包含无符号整数的文件,并用C ++将其写入二进制文件

时间:2016-12-05 18:50:23

标签: c++ file input

我有一个文本文件,包含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

2 个答案:

答案 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位宽