While Loop
May 4, 2012 at 6:04am UTC
Hi! I'm doing a class project where you read in from a master file and a transactions file and output/delete based on certain criteria. I validate and sort the master file into an array called customer. The issue I'm having is that it successfully deletes the first record that is supposed to be deleted, but after it deletes the second (and last) record that is supposed to be deleted it calls in the next action code (A, D, E, or P), but instead of going to the appropriate if loop, it goes to the Delete loop for all of the remaining records despite them having differect codes. They do all make it to the newMaster file, but there are some that are also supposed to be printed to the console, but they don't get there. Sorry this is so long, but I really appreicate any help you can offer.
Thanks!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
while (!inMaster.eof())
{
if (validcustID(temp.custID))
{
if (temp.Status == "S" )
{temp.Limit = 0;
customer[i] = temp; //output to array
i++;
inMaster >> temp;
count++;}
else
{
customer[i] = temp; //output to array
inMaster >> temp;
i++;
count++;
}
}
else
{
outError << "Invalid customer ID with the following record" << "\t" ;
outError << temp; //output to error_log
inMaster >> temp;
}
}
if (validcustID(temp.custID))
{
if (temp.Status == "S" )
{temp.Limit = 0;
customer[i] = temp; //output to array
i++;
count++;}
else
{
customer[i] = temp; //output to array
i++;
count++;
}
}
else
{
outError << "Invalid customer ID with the following record" << "\t" ;
outError << temp; //output to error_log
}
sort (customer, count); //sorted by count instead of i because i is created before something is written
//newMaster.txt is the Master file altered by the Transactions file
string TransCode;
string TransString;
float TransFloat;
int Field;
record TransTemp;
i=0;
inTransaction >> TransCode;
while ((!inTransaction.eof()) && (i<count))
{
if (TransCode == "A" )
{
cout << "Add" << endl;
inTransaction >> TransTemp;
if (TransTemp.custID > customer[i].custID)
{
//add array to newMaster then read in new array
outNewMaster << customer[i];
//do i need to bring in the next array here, or does it automatically do that?
}
else if (TransTemp.custID == customer[i].custID)
{
//add trans record to newMaster then read in new TransTemp
outNewMaster << TransTemp;
inTransaction >> TransCode;
i++;
}
else if (TransTemp.custID < customer[i].custID)
{
//add trans record to newMaster then read in new TransTemp and new array
outNewMaster << TransTemp;
inTransaction >> TransCode;
i++;
}
cout << "End Add" << endl;
}
if (TransCode == "D" )
{
cout << "Delete" << endl;
inTransaction >> TransTemp.custID;
if (TransTemp.custID == customer[i].custID)
{
//add nothing to newMaster read in new TransTemp and new array record
i++;
inTransaction >> TransTemp;
}
else if (TransTemp.custID > customer[i].custID)
{
//add array to newMaster then read in new array
outNewMaster << customer[i];
i++;
}
else if (TransTemp.custID < customer[i].custID)
{
//read in new TransTemp
inTransaction >> TransCode;
}
cout << "End Delete" << endl;
}
if (TransCode == "E" )
{
cout << "Edit" << endl;
inTransaction >> TransTemp.custID;
if (TransTemp.custID > customer[i].custID)
{
//output array to newMaster then read in new array
outNewMaster << customer[i];
i++;
}
if (customer[i].custID == TransTemp.custID)
{
inTransaction >> Field;
//detrmine field number
if (Field == 1)
{
inTransaction >> customer[i].FirstName;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
else if (Field == 2)
{
inTransaction >> customer[i].LastName;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
else if (Field == 3)
{
inTransaction >> TransFloat;
float value;
if (customer[i].Status == "H" )
{
value = ((customer[i].Balance)/2);
if (TransFloat <= value)
{
customer[i].Status = "O" ;
customer[i].Balance = TransFloat;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
else
{
customer[i].Balance = TransFloat;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
}
else
{
customer[i].Balance = TransFloat;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
}
else if (Field == 4)
{
inTransaction >> customer[i].Limit;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
else if (Field == 5)
{
inTransaction >> customer[i].Status;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
//determine whether it is string or float
//set corresponding field to change value
//edit array record then output to newMaster then read in new TransTemp and new array
}
else if (TransTemp.custID < customer[i].custID)
{
//read in new TransTemp
inTransaction >> TransCode;
}
cout << "End Edit" << endl;
}
if (TransCode == "P" )
{
cout << "Print" << endl;
inTransaction >> TransTemp.custID;
if (TransTemp.custID > customer[i].custID)
{
//output array then read in new array record
outNewMaster << customer[i];
i++;
}
else if (TransTemp.custID == customer[i].custID)
{
//print array to screen and newMaster then read in new TransTemp and new array
cout << customer[i].custID << "\t" << customer[i].FirstName << "\t" << customer[i].LastName << "\t" << customer[i].Balance << "\t" << customer[i].Limit << "\t" << customer[i].Status << endl;
outNewMaster << customer[i];
i++;
inTransaction >> TransCode;
}
else if (TransTemp.custID < customer[i].custID)
{
//read in new TransTemp
inTransaction >> TransCode;
}
cout << "End Print" << endl;
}
else
{
//output invalid transaction action code to Error_Log
outError << TransTemp << endl;
}
}
May 4, 2012 at 5:56pm UTC
Such posts are often very time consuming without a "test harness"
Could you provide a small program that uses this loop and example data files?
Meanwhile, I'll play around with it and see what I can come up with.
Topic archived. No new replies allowed.