Notes: • The solution should be general to processing any file with the same sch
ID: 3818450 • Letter: N
Question
Notes:
• The solution should be general to processing any file with the same schema, not only
applicable to the given file example.
• The program will be tested with data files with the same schema.
Assignment Marking Scheme
: • Program correctness (75%)
• Program indentation and readability (5%)
• Choice of significant names for identifiers (5%)
• Comments - description of variables and constants (5%)
/// MY IMPLEMENTATION OF THE CODE BUT I DONT KNOW WHAT I AM DOING WRONG NOTING IS OUTPUTTING :( !!!! THE CODE IS IN C ++ CAN SOMEONE PLEASE HELP ME BY DOING THE CORRECT IMPLEMENTATION OF THE CODE BY THE GIVEN GUIDELINE CAUSE DONT KNOW WHAT IM DOING WRONG
//// DataStorage.h//
class DataStorage{
private: //Pointers' data members
int *iPtr; //Private data member: pointer of type integer
float *fPtr; //Private data member: pointer of type float
char *cPtr; //Private data member: pointer of type character
// Date *dPtr;
int dSize;
public: //Member functions
DataStorage(); //Constructor
void setIntPtr(int*); //Member function that sets pointer as an integer type
void setFloatPtr(float*); //Member function that sets pointer as a float type
void setCharPtr(char*); //Member function that sets pointer as a character type
int* getIntPtr(); //Accessing function that returns a pointer of type integer
float* getFloatPtr(); //Accessing function that returns a pointer of type float
char* getCharPtr(); //Accessing function that returns a pointer of type character
};
///DataStorage.cpp/////////
#include <iostream>
#include <fstream>
#include "DataStorage.h"
#include <iterator>
#include <sstream>
#include <string>
using namespace std;
//Constructor of the class DataStorage
DataStorage::DataStorage()
{
}
//end of constructor
//Member function that sets pointer as an integer type
void DataStorage::setIntPtr(int* intPtr)
{
iPtr = intPtr;
fPtr = 0;
cPtr = 0;
}
//end of setIntPtr function
//Member function that sets pointer as a float type
void DataStorage::setFloatPtr(float* floatPtr)
{
iPtr = 0;
fPtr = floatPtr;
cPtr = 0;
}
//end of setFloatPtr function
//Member function that sets pointer as a character type
void DataStorage::setCharPtr(char* charPtr)
{
iPtr = 0;
fPtr = 0;
cPtr = charPtr;
}
//end of setCharPtr function
//Accessing function that returns a pointer of type integer
int* DataStorage::getIntPtr()
{
return iPtr;
}
//end of getIntPtr function
//Accessing function that returns a pointer of type float
float* DataStorage::getFloatPtr()
{
return fPtr;
}
//end of getFloatPtr function
//Accessing function that returns a pointer of type character
char* DataStorage::getCharPtr()
{
return cPtr;
}
void readFile(DataStorage*& dsPtr, int* size) {
ifstream inFile;
inFile.open("config.dat");
// exit program if ifstream could not open file
if (!inFile) {
cout << "File could not be opened" << endl;
exit(1);
}
char line[200];
int numLines=0;
inFile.unsetf(std::ios_base::skipws);
// find out how many lines the file has
unsigned line_count = count(std::istream_iterator<char>(inFile),std::istream_iterator<char>(),' ');
cout << line_count << endl;
dsPtr = new DataStorage[line_count + 1];
inFile.clear();
inFile.setf(std::ios_base::skipws);
inFile.seekg(0);
int totalLine = 0;
//Wrting the exception code
try{
while (!inFile.eof())
{
char dataType[10];
int dSize;
inFile >> dataType;
inFile >> dSize;
// cout << dSize << dataType << endl;
if (strcmp(dataType, "int") == 0)
{
int *iPtr = new int[dSize+1];
iPtr[0] = dSize;
for (int i = 1; i <= dSize; i++)
inFile >> iPtr[i];
dsPtr[totalLine++].setIntPtr(iPtr);
}
else if (strcmp(dataType, "float") == 0)
{
float *fPtr = new float[dSize+1];
fPtr[0] = dSize;
for (int i = 1; i <= dSize; i++)
inFile >> fPtr[i];
dsPtr[totalLine++].setFloatPtr(fPtr);
}
else if (strcmp(dataType, "char") == 0)
{
char *cPtr = new char[dSize+1];
cPtr[0] = dSize;
for (int i = 1; i <= dSize; i++)
inFile >> cPtr[i];
dsPtr[totalLine++].setCharPtr(cPtr);
}
if(totalLine == 3){
break;
}
}
*size = totalLine;
}
//Trying to catch the exception
catch (exception e)
{
cout << "do sth" << endl;
}
inFile.close();
}
////driver.cpp/////////////////////////////
#include <iostream>
#include <fstream>
#include "DataStorage.h"
#include <iterator>
#include <sstream>
#include <string>
using namespace std;
int main()
{
DataStorage* dsPtr;
int numLines=0;
//readFile("reverse.dat");
ofstream file("reverse.dat");
for (int i = 0; i < numLines; i++)
{
if (dsPtr[i].getCharPtr())
{
char* ptr = dsPtr[i].getCharPtr();
for (int j = (int)ptr[0]; j >= 0 ; j--){
file << ptr[j];
cout << ptr[j] << ' ';
}
}
else if (dsPtr[i].getFloatPtr())
{
float* ptr = dsPtr[i].getFloatPtr();
for (int j = (int)ptr[0]; j >= 0 ; j--){
file << ptr[j];
cout << ptr[j] << ' ';
}
}
else
{
cout << "Correct data " << endl;
int* ptr = dsPtr[i].getIntPtr();
for (int j = 1 ; j < (int)ptr[0] ; j++){
cout << ptr[j] << ' ';
}
cout << endl << "reverse String" << endl;
for (int j = (int)ptr[0]; j >= 0 ; j--){
file << ptr[j];
cout << ptr[j] << ' ';
}
}
cout << endl;
file.close();
}
system("pause");
return 0;
}
//////config.dat/////////////
int 12 1 9 1 8 6 3 4 3 9 7 0
float 2 5.30 56.31
chat 6 h a y K o z
float 3 5.55 22.41 10.11
//reverse.dat////
0 7 9 3 4 3 6 8 1 9 1 12 int
56.31 5.30 2 float
z o K y a h 6 chat
10.11 22.41 5.55 3 float
Explanation / Answer
Your program is going in an infinite loop since it can't write a string as int in integer array. First input line contains just 11 values while the size specified is 12. Anyways, there were many useless lines in your code, I have cleaned it and the output is coming correct now. Also please enter input file path+name through command line as specified in question.
e.g., g++ DataStorage.cpp
./a.out /home/Assignments/config.dat
Please check and let me know in case of any doubts.
//DataStorage.cpp
#include <bits/stdc++.h>
#include <iostream>
#include <fstream>
#include <iterator>
#include <sstream>
#include <string>
#include <string>
using namespace std;
void readFile( char* fileName) {
ofstream file;
file.open("reverse.dat", std::ios_base::app);
ifstream inFile (fileName);
// exit program if ifstream could not open file
if (!inFile) {
cout << "File could not be opened" << endl;
exit(1);
}
try{
while (!inFile.eof())
{
char dataType[10] = {""};
int dSize=0;
inFile >> dataType;
inFile >> dSize;
if(inFile.eof())
break;
file << dataType << " " << dSize <<" ";
if (strcmp(dataType, "int") == 0)
{
int *iPtr = new int[dSize+1];
iPtr[0] = dSize;
for (int i = 1; i <= dSize; i++)
{
inFile >> iPtr[i];
}
for (int i=dSize ; i > 0 ; i--)
{
file << iPtr[i] <<" ";
}
file <<endl;
}
else if (strcmp(dataType, "float") == 0)
{
float *fPtr = new float[dSize+1];
fPtr[0] = float(dSize);
for (int i = 1; i <= dSize; i++)
{
inFile >> fPtr[i];
}
for (int i=dSize ;i>0 ; i--)
{
file << fPtr[i] <<" ";
}
file <<endl;
}
else if (strcmp(dataType, "char") == 0)
{
char *cPtr = new char[dSize+1];
cPtr[0] = char(dSize);
for (int i = 1; i <= dSize; i++)
{
inFile >> cPtr[i];
}
for (int i=dSize ;i>0 ; i--)
{
file << cPtr[i] <<" ";
}
file <<endl;
}
else {
cout<<"Invalid input found!Please check your input file. ";
break;
}
}
}
catch (exception e)
{
cout << " exception found" << endl;
}
inFile.close();
file.close();
}
int main(int argc, char** argv)
{
char* fileName = argv[1];
readFile(fileName);
return 0;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.