C ++读取文件末尾的剩余数据

时间:2013-11-29 03:41:22

标签: c++ file-io

我正在使用C ++以二进制模式从文件中获取输入;我将数据读入无符号整数,处理它们,并将它们写入另一个文件。问题是,有时候,在文件的末尾,可能会留下一些不足以容纳int的数据;在这种情况下,我想用0填充文件的末尾并记录需要多少填充,直到数据足够大以填充unsigned int。

以下是我从文件中读取的内容:

std::ifstream fin;
fin.open('filename.whatever', std::ios::in | std::ios::binary);
if(fin) {
    unsigned int m;
    while(fin >> m) {
        //processing the data and writing to another file here
    }
    //TODO: read the remaining data and pad it here prior to processing
} else {
    //output to error stream and exit with failure condition
}

代码中的TODO是我遇到麻烦的地方。在文件输入完成并且循环退出之后,我需要读取文件末尾的剩余数据,这些数据太小而无法填充unsigned int。然后我需要用二进制的0来填充数据的结尾,记录足够的填充量,以便将来能够取消填充数据。

这是如何完成的,这是否已由C ++自动完成?

注意:我无法将数据读入除unsigned int之外的任何内容,因为我正在处理数据,就好像它是用于加密目的的无符号整数。

编辑:有人建议我只读一下字符数组。假设这将读取文件中的所有剩余数据,我是否正确?重要的是要注意,我希望这适用于C ++可以在二进制模式下打开输入和/或输出的任何文件。感谢您指出我未能包含以二进制模式打开文件的详细信息。

编辑:我的代码所操作的文件不是由我写的任何东西创建的;它们可以是音频,视频或文本。我的目标是使我的代码格式不可知,所以我不能假设文件中的数据量。

编辑:好的,基于建设性意见,这是我所看到的方法,记录在操作将会发生的评论中:

std::ifstream fin;
fin.open('filename.whatever', std::ios::in | std::ios::binary);
if(fin) {
    unsigned int m;
    while(fin >> m) {
        //processing the data and writing to another file here
    }
    //1: declare Char array
    //2: fill it with what remains in the file
    //3: fill the rest of it until it's the same size as an unsigned int
} else {
    //output to error stream and exit with failure condition
}

此时的问题是:这是真正与格式无关的吗?换句话说,用于测量文件大小的字节是否为离散单位,或者文件的大小是11.25字节?我知道,我应该知道这一点,但无论如何我都要问它。

2 个答案:

答案 0 :(得分:1)

  

用于测量文件大小的字节是否为离散单位,或者文件的大小是否为11.25字节?

没有数据类型可以少于一个字节,并且您的文件表示为char的数组,这意味着每个字符都是一个字节。因此,不可能以字节为单位获得整数度量。

答案 1 :(得分:0)

根据你的帖子,这是第一步,第二步和第三步:

while (fin >> m)
{
    // ...
}

std::ostringstream buffer;
buffer << fin.rdbuf();

std::string contents = buffer.str();

// fill with 0s
std::fill(contents.begin(), contents.end(), '0');