注:输入的input.csv文件末尾必须有换行符结束,最后一行的index必须是200,不然程序无法正常执行。
相应的測试文件在博客的最后
#include "stdafx.h"
#include <string.h> #include <math.h> #include <stdlib.h> #define PEAK_VOLT 33.8 #define WAVE_END_FLAG 5 #define WAVE_MIDDLE_FLAG 0 #define MAX_INDEX 200 typedef unsigned char BYTE; typedef struct tagPointCoor{ int x_Index;double y_Volt; }PointCoor; typedef struct tagPointInfo{ PointCoor Coor;double Percent;int PosFlag; }PointInfo; char WriteFilePath[] = "c:\\my_path\\output.csv"; char ReadFilePath[] = "c:\\my_path\\input.csv"; int WritePointInfo(FILE *fp, PointInfo *Point); int WriteLine(FILE *fp, const PointCoor *StartPoint, const PointCoor *EndPoint); int GetPosFlag(const PointCoor *Point); void WriteWave(FILE *Input, FILE *Output); void GetNextPoint(FILE *Input, PointCoor *Point); void WritePoint(FILE *fp, PointCoor *Point); int _tmain(int argc, _TCHAR* argv[]) { FILE *Output = NULL;FILE *Input = NULL;//PointInfo RandomPoint;//PointCoor StartPoint;//PointCoor EndPoint;//PointCoor Point;////StartPoint.x_Index = 1;//StartPoint.y_Volt = 33;//EndPoint.x_Index = 100;//EndPoint.y_Volt = 33;//RandomPoint.Coor.x_Index = 2;//RandomPoint.Coor.y_Volt = 20;//RandomPoint.Percent = 0.4;//RandomPoint.PosFlag = 5;Input = fopen(ReadFilePath, "r");Output = fopen(WriteFilePath, "w");if((Input == NULL)||(Output == NULL)){ return -1;}WriteWave(Input, Output);system("pause"); } void GetNextPoint(FILE *Input, PointCoor *Point) { char ch;char StrBuf[10] = {0};int Cnt = 0;int CommaPos = 0;ch = fgetc(Input);while(ch != '\n'){ switch(CommaPos){ case 0: //index{ if(ch == ','){ Point->x_Index = atoi(StrBuf);memset(StrBuf, 0, 10);CommaPos++;Cnt = 0;break;}StrBuf[Cnt++] = ch;}break;case 1: //voltage{ StrBuf[Cnt++] = ch;}break;default:break;}ch = fgetc(Input);}Point->y_Volt = atof(StrBuf); } void WriteWave(FILE *Input, FILE *Output) { PointCoor StartPoint;PointCoor NextPoint;int PosFlag;GetNextPoint(Input, &StartPoint);do{ GetNextPoint(Input, &NextPoint);WriteLine(Output, &StartPoint, &NextPoint);StartPoint = NextPoint;if((PosFlag = GetPosFlag(&NextPoint)) == WAVE_END_FLAG){ WritePoint(Output, &NextPoint);}}while(PosFlag != WAVE_END_FLAG); } void WritePoint(FILE *fp, PointCoor *Point) { PointInfo RandomPoint;RandomPoint.Coor.x_Index = Point->x_Index;RandomPoint.Coor.y_Volt = Point->y_Volt;RandomPoint.Percent = RandomPoint.Coor.y_Volt / PEAK_VOLT;RandomPoint.PosFlag = GetPosFlag(Point);WritePointInfo(fp, &RandomPoint); } int WritePointInfo(FILE *fp, PointInfo *Point) { char WriteBuf[20] = {0};if(fp == NULL)return -1;sprintf(WriteBuf, "%d,%.2lf,%d\n", Point->Coor.x_Index, Point->Percent, Point->PosFlag);printf("%s", WriteBuf);printf("the strlen(Writebuf) is %d \n ", strlen(WriteBuf));fwrite(WriteBuf, strlen(WriteBuf), 1, fp);return 0; } int GetPosFlag(const PointCoor *Point) { int PosFlag;if(Point->x_Index >= MAX_INDEX){ PosFlag = WAVE_END_FLAG;}else{ PosFlag = WAVE_MIDDLE_FLAG;}return PosFlag; } int WriteLine(FILE *fp, const PointCoor *StartPoint, const PointCoor *EndPoint) { PointInfo RandomPoint;double Slope;if(fp == NULL){ return -1;}RandomPoint.Coor.x_Index = StartPoint->x_Index;Slope = (EndPoint->y_Volt - StartPoint->y_Volt)/(EndPoint->x_Index - StartPoint->x_Index);while(RandomPoint.Coor.x_Index < EndPoint->x_Index){ RandomPoint.Coor.y_Volt = Slope*(RandomPoint.Coor.x_Index - StartPoint->x_Index) + StartPoint->y_Volt;RandomPoint.Percent = RandomPoint.Coor.y_Volt / PEAK_VOLT;RandomPoint.PosFlag = GetPosFlag(&RandomPoint.Coor);WritePointInfo(fp, &RandomPoint);RandomPoint.Coor.x_Index++;}return 0;}