【问题标题】:Read a file containing unsigned ints and write it into binary in C++读取包含无符号整数的文件并将其写入 C++ 中的二进制文件
【发布时间】:2016-12-05 18:50:22
【问题描述】:

我有一个文本文件,其中包含 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 &lt; bla | wc -c

其中“bla”是一个包含

的文件
1864754174
2150244390
1703231727

命令的结果是4,而不是我预期的12

【问题讨论】:

  • 你尝试了什么?现在,这个问题只是给我代码。这几乎会立即被否决并关闭。记得编辑你的问题,不要只在 cmets 部分回答这个问题。
  • 好的,现在什么不起作用?请阅读如何创建MCVE
  • 编辑,问题。你在这个网站上问了足够多的问题,知道如何问一个好问题。
  • 代码看起来没问题(除了return 1 - 应该是return 0,事实上x 应该是uint32_t,而不是int)。您需要提供更多详细信息,说明您是如何构建和运行它的,以及它如何没有按要求运行,
  • 虽然我个人会这样做:std::cout.write((char*)&amp;x, sizeof(x));.

标签: c++ file input


【解决方案1】:

你的问题是你试图写 int 而不是 unsigned int。 这两个之间的差异不是它们的大小,而是字节的使用。

在无符号整数中,每一位都表示从 1 开始的 2^(index -1) 索引。

在 int 中,这些位与 unsiged int 一样使用,只是最后一位用于表示数字的符号,因为您可以表示较小的数字。

【讨论】:

  • 这是否解释了为什么它似乎只写了一个int
【解决方案2】:

如果我理解正确,您想从包含 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);
    }
}

确保包含&lt;fstream&gt;。您可以将 unsigned int 更改为 uint32_t 以确保它在每个平台上都是 32 位宽

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2014-05-20
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多