2016-12-05 67 views
-1

我有一个文本文件,其中包含范围为0,..,2^32-1的无符号整数。 每行包含一个整数(和一个换行符char)。读取包含无符号整数的文件并将其写入C++中的二进制文件

我想写入一个二进制文件来节省空间(这样每个int将占用4个字节)。什么是最好的方式来做到这一点?

我试了几个选项,他们都没有似乎工作。帮助将不胜感激。

电流(非工作)代码: g++ compress.cc -o compress

#include <fstream> 
#include <iostream> 
#include <stdio.h> 

int main(){ 
    int x; 
    while (std::cin >> x){ 
     fwrite((void*)&x, sizeof(x), 1, stdout); 
    } 
    return 0; 
} 

它使用编译。

但是,它似乎只输出第一个整数。

例如,具有我跑的命令./compress < bla | wc -c

其中“BLA”是含有

1864754174 
2150244390 
1703231727 

该命令的结果是一个4文件,而不是作为12我的预期。

+2

您尝试了什么?现在,这个问题只是给我的代码。几乎立即就会下调和关闭。请记住编辑你的问题,不要在评论部分回答这个问题。 –

+0

@Ben - 增加了代码,感谢您的评论。 –

+3

好吧,现在什么不行?请阅读如何创建[MCVE](http://stackoverflow.com/help/mcve) –

回答

3

你的问题是你正在尝试写int而不是unsigned int。 这些2之间的差异不是它们的大小,而是字节的使用。

在无符号整型

每个比特reprsent 2 ^(指数-1)指数从1

在INT中的位开始使用等unsiged INT刚刚过去的位用于reprsent数量和怎么一回事,因为的符号你可以代表较小的数字。

+0

这是否解释了为什么它似乎只写了一个'int' – qxz

+0

这实际上已经奏效。我多么愚蠢。谢谢 ! –

0

如果我正确地理解了你,你想从包含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位。

相关问题