读取包含16位签名数据的文件

时间:2013-08-25 20:10:30

标签: c++ file file-io fopen

我想打开一个包含16位签名数据的文件(大约400kb),做一些计算(例如output [i] = input [i] - input [i-1]),然后将输出写入一个新文件。

我在C ++中对这么简单的事情有点困惑:我知道如何在文件中编写文本,而不是原始数据。一个小的工作示例会很棒!

2 个答案:

答案 0 :(得分:1)

这是读写操作。

#include <fstream>

ifstream infile("input", ios_base::binary);
int16_t in[100], out[100];
infile.read(reinterpret_cast<char*>(in), sizeof in);
...
ofstream outfile("output", ios_base::binary);
outfile.write(reinterpret_cast<char*>(out), sizeof out);

但仍有很多工作要做,例如错误检查,动态分配,结束。

答案 1 :(得分:0)

你不......实际上需要阅读整个shebang,你可以在飞行中阅读:

#include <fstream>
#include <cstring>
#include <cstdint>

using namespace std;

bool read_word(istream& is, int16_t& value)
{
    char buf[sizeof(int16_t)];
    if (is.read(buf, sizeof(buf)))
    {
        memcpy(&value, buf, sizeof(value));
        return is;
    }
    return false;
}

bool write_word(ostream& os, int16_t value)
{
    char buf[sizeof(int16_t)];
    memcpy(buf, &value, sizeof(buf));
    return os.write(buf, sizeof(buf));
}

int main()
{
    ifstream ifs("input.dat", ios::binary);

    int16_t previous, next;
    if (read_word(ifs, previous))
    {
        ofstream ofs("output.dat", ios::binary);
        while (read_word(ifs, next))
        {
            if (!write_word(ofs, next - previous))
                return 255;
            previous = next;
        }
    }
}

当然,如果您一次性使用readsome或读取块(通常为4k大小),您的表现可能会提高。