我想打开一个包含 16 位签名数据的文件(大约 400kb),进行一些计算(例如 output[i] = input[i] - input[i-1]),然后将输出写入一个新文件。
我对 C++ 中这样一个简单的事情有点坚持:我知道如何在文件中写入文本,但不知道原始数据。一个小的工作示例会很棒!
这是读取和写入操作。
#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);
但还有很多事情要做,比如错误检查、动态分配、字节序。
您不需要...实际上需要阅读整个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 大小的块,您的性能可能会有所提高。