C++通过输入输出流完成对双通道数据实部虚部的反转

该项目涉及使用C++处理双通道天线数据,通过输入输出流操作实现数据实部与虚部的反转。文中详细介绍了如何利用seekg和seekp函数控制流的位置,以达到数据反转并写入新文件的目的。若只需反转数据,可简化代码,无需移动原有数据。
摘要由CSDN通过智能技术生成

在最近的一个项目中,需要对双通道天线采集到数据的实部与虚部反转,以便后续进行处理,为了便于检查,顺便写了把新的数据输出到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");
}

由于我的项目需求是将数据反转排列后再接到原数据上,所以如果仅需要反转操作的话把新定义的缓存块改小一倍,同时把原数据搬到新缓存块这一步省略掉即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值