You could change the delimiter to be the colon. See this answer for more information
Or the simpler approach would be to use the getline()
function:
istream& getline (istream& is, string& str, char delim)
So, for your example:
int itemNo;
string category;
string descript;
ifstream infile("menu.txt");
infile >> itemNo;
getline(infile, category, ':');
getline(infile, descript);
cout << category << " - " << descript << " - " << itemNo <<'\n';
That will give:
Fish Dish - Fish and chips - 1
To get rid of the extra space at the start of Fish Dish, add an extra getline.
int itemNo;
string category;
string descript;
ifstream infile("menu.txt");
infile >> itemNo;
getline(infile, category, ' ');
getline(infile, category, ':');
getline(infile, descript);
cout << category << " - " << descript << " - " << itemNo <<'\n';