#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include <sstream>
#include <math.h>
#include <stdio.h>
using namespace std;
// files has to be in folder specified in (string) fileLocation
int main(void)
{
fstream inputFile;
ofstream outputFile;
string fileName;
string fileLocation = "../Data/";
string fileOutName;
string fileOutNameHelp = "";
string castString; // help-string for casting int to string...
string outputString;
vector< vector <int> > inputRanges(2000, vector<int> (181, 0));
int sumRanges = 0;
float average;
int outputFileLenght = 0;
int inputRange;
float initFloat;
char* charArray = new char[80];
int numberOfGoodFiles = 0;
int numberOfBadFiles = 0;
float sumRangesFloat = 0.0;
float numberOfGoodFilesFloat = 0.0;
// iterate over all 2000 input-files
for (int i = 0; i <= 1999; i++)
{
// creating input-fileName depends on the lenght of i
if (i < 10)
{
fileName = fileLocation;
fileName.append("Front00000"); // i >= 0 && i < 10 means there are 5 Zeros before adding i
stringstream castStringStream;
castStringStream<<i;
castStringStream>>castString;
fileName.append(castString);
fileName.append(".dat");
}
if (i >= 10 && i < 100)
{
fileName = fileLocation;
fileName.append("Front0000"); // i >= 10 && i < 100 means there are 4 Zeros before adding i
stringstream castStringStream;
castStringStream<<i;
castStringStream>>castString;
fileName.append(castString);
fileName.append(".dat");
}
if (i >= 100 && i < 1000)
{
fileName = fileLocation;
fileName.append("Front000"); // i >= 100 && i < 1000 means there are 3 Zeros before adding i
stringstream castStringStream;
castStringStream<<i;
castStringStream>>castString;
fileName.append(castString);
fileName.append(".dat");
}
if (i >= 1000)
{
fileName = fileLocation;
fileName.append("Front00"); // i >= 1000 means there are 2 Zeros before adding i
stringstream castStringStream;
castStringStream<<i;
castStringStream>>castString;
fileName.append(castString);
fileName.append(".dat");
}
// open Input-File
inputFile.open(fileName.c_str(), ios::in);
// if read in of input-file successfull
if (inputFile.good())
{
// delete the two comment-lines at the beginning of input-file
getline(inputFile, castString);
getline(inputFile, castString);
for (int j = 0; j <= 180; j++)
{
getline(inputFile, castString); // get next line of the input-file
{
if(castString.find("#") == string::npos)
{
// cast string to int
std::istringstream helpString("0");
helpString.str(castString);
helpString>>inputRange;
inputRanges[i][j] = inputRange;
}
}
}
numberOfGoodFiles++;
}
else
{
numberOfBadFiles++;
}
inputFile.close();
}
// create output-filename
fileOutName = fileLocation;
fileOutName.append("averageOfRanges.dat");
// create output-file
string castHelpString;
outputString = "# 181 points";
outputFileLenght += 12;
outputString.append("\n");
outputFileLenght++;
outputString.append("# average of 2000 range-measurements");
outputFileLenght += 36;
for (int i = 0; i <= 180; i++)
{
for (int j = 0; j <= 1999; j++)
{
sumRanges += inputRanges[j][i];
}
if (numberOfGoodFiles != 0)
{
sumRangesFloat = sumRanges;
numberOfGoodFilesFloat = numberOfGoodFiles;
average = sumRangesFloat / numberOfGoodFilesFloat;
}
else
average = 0.0;
sumRanges = 0;
outputString.append("\n");
// next 3 lines: casting (float) average to (Array of chars) charArray to get it in the outputString
// inputRange is used as a help variable to count the file-lenght correctly
initFloat = 0.0;
sprintf(charArray, "%f", initFloat);
inputRange = sprintf(charArray, "%f", average);
outputString.append(charArray);
outputFileLenght++;
outputFileLenght += inputRange;
}
// open and write output-file
outputFile.open(fileOutName.c_str(), ios::out);
outputFile.write(outputString.c_str(), outputFileLenght);
outputFileLenght = 0;
// cleaning output file
outputFile.close();
cout << "\nsuccessfull reading of " << numberOfGoodFiles << " input Files.\n";
if(numberOfBadFiles >= 1)
cout << "could not read " << numberOfBadFiles << " input Files.\n";
else
cout << "Read all input Files!\n";
cout << "1 File created: " << fileOutName << "\n\n";
cout << "Done!";
return 0;
}