1

16 ビットの符号付きデータを含むファイル (約 400kb) を開き、いくつかの計算 (たとえば、output[i] = input[i] - input[i-1]) を実行してから、出力を新しいファイルに書き込みたいと思います。

私はC ++でこのような単純なことに少しこだわっています.ファイルにテキストを書き込む方法は知っていますが、生データは知りません. 小さな実用的な例は素晴らしいでしょう!

4

2 に答える 2

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);

ただし、エラー チェック、動的割り当て、エンディアンなど、やるべきことはまだたくさんあります。

于 2013-08-25T20:15:19.607 に答える
0

あなたは...実際にシバン全体を読む必要はありません。その場で読むことができます:

#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 サイズのブロックを一度に使用または読み取ると、パフォーマンスが向上する可能性があります。

于 2013-08-25T20:25:34.007 に答える