在最近的一个项目中,需要对双通道天线采集到数据的实部与虚部反转,以便后续进行处理,为了便于检查,顺便写了把新的数据输出到txt文件中的部分。
这段代码中包含了关于文件输入输出流的操作,也有用于确定和改变输入输出流位置的seekg,seekp等函数的用法。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
//定义路径结构体
typedef struct DATA_PATH
{
std::string bAsepAth;
std::string dAtapAth;
std::string oUtputpAth;
DATA_PATH()
{
bAsepAth = "数据文件所在路径";
dAtapAth = bAsepAth + "你要操作的数据文件.dat";
oUtputpAth = bAsepAth + "输出文件.dat";
}
}DATA_PATH;
class GetData
{
public:
char* DataBuffer; //存储数据的缓存块
long sizeDataBuffer;
int blocklength = 210;//为用于反转操作的一块数据长度,我自己所用的是210
DATA_PATH DataPath;
bool hasLoaded;
bool ReadWriteData()
{
sizeDataBuffer = ReadWriteDatafromBFile(DataPath.dAtapAth.c_str(), DataPath.oUtputpAth.c_str(), DataBuffer);
if (sizeDataBuffer < 0)
{
std::cout << "测试数据写入失败!!!" << std::endl;
return false;
}
else
{
std::cout << "测试数据写入成功。" << std::endl;
return true;
}
};
long ReadWriteDatafromBFile(const char* pAthin, const char* pAthout, char* &dAta)
{
delete[] dAta;
// 要读入整个文件,必须采用二进制打开
std::ifstream DataFile(pAthin, std::ifstream::binary);
//判断文件路径是否正确
if (!DataFile.is_open())
{
std::cout << "文件打开失败!" << std::endl;
std::cout << "路径为: " << pAthin << std::endl;
return -1;
}
else
{
long size = 0;
//获得文件的大小
DataFile.seekg(0, std::ifstream::end);
size = DataFile.tellg();
std::cout << "开始读取数据到缓存 " << std::endl;
std::cout << "文件大小: " << size << std::endl;
std::cout << "路径为: " << pAthin << std::endl;
//让文件的指针跑到文件头
DataFile.seekg(0, std::ifstream::beg);
//开辟内存
dAta = new char[size + 1];
dAta[size] = '\0';
//eCho = new char[size];
//读取整个文件到内存
DataFile.read(dAta, size);
std::ofstream DataFileO(pAthout, std::ofstream::binary);
DataFileO.write(dAta, size);
std::cout << "开始写反转数据... " << std::endl;
int new_size_data = 2*2*416*96;//新缓存长度应该是二倍于你的原始数据的大小,我的数据块大小为416*96*2
//定义新的内存块存储反转的数据
dAta = new char[2 * new_size_data];
dAta[2 * new_size_data] = '\0';
char temp;
for (int k = 0; k < blocklength; k++)
{
DataFile.seekg(2* new_size_data * k, std::ifstream::beg);
DataFile.read(dAta, 2 * new_size_data);
for (int i = 0; i < new_size_data; i++)
{
temp = dAta[i];
dAta[i] = dAta[i + new_size_data];
dAta[i + new_size_data] = temp;
//将两路数据反转
}
//将指针头移动到文件末尾
DataFileO.seekp(0, ios::end);
DataFileO.write(dAta, 2 * new_size_data);
std::cout << "第 "<<k+1<<"组数据书写完毕..." << std::endl;
}
DataFile.close();
DataFileO.close();
return size;
}
};
};
int _tmain(int argc, _TCHAR* argv[])
{
GetData DA;
DA.ReadWriteData();//调用写好的函数
system("pause");
}
由于我的项目需求是将数据反转排列后再接到原数据上,所以如果仅需要反转操作的话把新定义的缓存块改小一倍,同时把原数据搬到新缓存块这一步省略掉即可。