Triming Spaces From Input File

Triming Spaces From Input File



I am having some trouble with a code I am writing. The program reads in from a file by reading it as a string into char structure variables and passes that to the trimField function to trim the program. This is the input text file we are given:


BROWN DANIELLA 810805748 562431322143323235411221 4213414131344422312122
DEREK SAMATHA I 002 10011313243433233344312212321342123 14212224242131121
SIMPSON BRETT 3844342323232233 33412342212342113221331132411112132
TOMATO A LUKE 811327785 15328003 4214341213331232354112432321532412124211142232213242



This function I have that reads in the file looks like this, where the numbers come from the structure variables (i.e. char Name[21];):


void readData(std::ifstream inFileStream, Scantron &inputRecord)
std::string incomingData;
getline(inFileStream, incomingData);
if(!inputTestFile.eof)
for(int i = 0; i < incomingData; i++)
std::cin.get(inputRecord[i].Name, 21, ' ');
std::cin.get(inputRecord[i].Id, 11, ' ');
std::cin.get(inputRecord[i].CRN, 6, ' ');
std::cin.get(inputRecord[i].testCode, 3, ' ');
std::cin.get(inputRecord[i].specialCode, 4, ' ');
std::cin.get(inputRecord[i].score, 4, ' ');
std::cin.get(inputRecord[i].answerArray, 61, ' ');





My current function that calls the trimField function looks like this:


csvRecord transformDataToCSV(Scantron inputRecord)

csvRecord outputRecord;
trimField(inputRecord.Name, outputRecord.Name);
trimField(inputRecord.Id, outputRecord.Id);
trimField(inputRecord.score, outputRecord.score);
for(int i = 0; i < 60; ++i)
outputRecord.answerArray[i] = inputRecord.answerArray[i];
trimField(inputRecord.answerArray, outputRecord.score);


return outputRecord;



And the header for my trimField has to look like this:


// remove trailing spaces from fieldIn cstring and place in fieldOut cstring. If entire field is blank place one space followed by .
void trimField(char fieldIn, char &fieldOut )




I'm not sure how to even start when it comes to trimming the file and there's too many different ways to do it online and that's making it hard for me to understand how to do this.




1 Answer
1



I'm puzzled why you still work with cstring. Even more puzzled that you try to pass a an array of reference for the output; this doesn't compile:


error: declaration of ‘fieldOut’ as array of references
void trimField2(char fieldIn, char &fieldOut) {
^



Nevertheless, here a simple solution: counting the number of spaces at the beginning, counting the number of spaces at the end, and copy only what's left:


void trimField(char fieldIn, char fieldOut )
int i=0;
// skip left spaces with i
while (fieldIn[i] && isspace(fieldIn[i]) )
i++;
// skip right spaces starting from end with j (relative to i)
int j=strlen(fieldIn+i);
while (j && isspace (fieldIn[j+i-1]) )
j--;
strncpy(fieldOut, fieldIn+i, j);
fieldOut[j]='';



Note that this function is insecure, because it doesn't take into account a maximum length of the output as a parameter, thus risking buffer overflow. In addition it's error prone, because the input is not defined as const.


const



I propose you a variant that returns a true C++ string and takes as input a const buffer:


std::string trimField(const char fieldIn)
const char *p, *q,*r;
for (p=fieldIn; *p && isspace(*p); p++ ) // skip left spaces
;
for (q=r=p; *q; q++) // sorry for the tripple assignment ;-)
if (!isspace (*q))
r=q; // keep trace of last non white
return std::string (p, r+1);



For convenience, I switched to pointers. For avoiding to read twice the chars after the first non space char, we simultaneously search for the end of the input string (q) and keep track of the las non white char (r). Finally we construct a string based on a start and end pointer/iterator.






I'm not quite sure why either. The functions were defined by our instructor ahead of time for us and we aren't supposed to change them.

– Julia Lynn Mancuso
Sep 15 '18 at 22:15






Thank you for your help though!

– Julia Lynn Mancuso
Sep 15 '18 at 22:16



Thanks for contributing an answer to Stack Overflow!



But avoid



To learn more, see our tips on writing great answers.



Required, but never shown



Required, but never shown




By clicking "Post Your Answer", you agree to our terms of service, privacy policy and cookie policy

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)