The problem is that you're combining different types of inputs. getline() reads up to, extracts and discards, the newline character that exists at the end of a line of input. The extraction operator (>>) reads up to, and leaves, the newline character at the end of a line of input leaving the input stream "dirty", but salvageable. When you have this situation, you need to use istream::ignore() to "clean" the stream by getting rid of that dangling newline.
What is happening is the newline that the extraction operator leaves behind gets consumed by the getline (boatList, regNumber); line as valid input. Then, getline (boatList, type); reads what should be the regNumber. Then, boatList >> id tries to read what should be the type. Do you see how they're one (1) line out-of-synch?
This results in a string being read into a numeric dataType. Your stream has now transitioned from "dirty" to "corrupt". Because it's corrupt, it is completely useless to you and can do no further reading which is why your values no longer change. Once you get to this point, more drastic measures are required. This requires the use of ios::good() and ios::clear() , in conjunction with istream::ignore() to correct this situation.
To avoid this situation, I would suggest you use another string, perhaps called "stats" and use another getline. Then, convert stats to a stringstream and extract from the stringstream to your numeric values.