读取包含未签名INT的文件,然后将其写入C 中的二进制文件

Read a file containing unsigned ints and write it into binary in C++

本文关键字:二进制文件 包含未 INT 读取 文件 然后      更新时间:2023-10-16

我有一个文本文件,其中包含范围0,..,2^32-1中的无符号整数。每行包含一个整数(和一个newline 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

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

例如,让i RAN命令./compress < bla | wc -c

其中" bla"是一个包含

的文件
1864754174
2150244390
1703231727

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

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

在未签名的int中,每位reprsent 2^(index -1)索引从1。

开始

在int中,钻头像无知的int一样使用,只有最后一个位用于代表您可以表示较小数字的数字和beacuse的迹象。

如果我正确理解了您,则要从包含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,以确保每个平台上的宽度均匀

相关文章: