Well, here is the gist of the problem. When I read in a file of integers, if there is a formatting character at the end, the last integer is repeated. For instance, in the code, it is reading i01.dat. If that file reads as follows:
2
3
4
5
with the newline character (or tab character, or whatever) at the end, then the five is printed twice when I cout the input even though I tried to use a break for the .eof() or .fail(). I have tried to use an if statement to test for \\n or \\t (i.e. if (i != \\n)) but the compiler does not understand this so I am obviously not testing properly. Please help me understand this. Here's what I've got so far.
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <cstdlib>
using namespace std;
struct CommandLineException
{
CommandLineException(int max, int actual)
{
cout << endl << "Too many command line arguments." << endl;
cout << "A maximum of " << max << " arguments are permitted." << endl;
cout << actual << " arguments were entered." << endl;
}
};
struct FileException
{
FileException(char* fn)
{
cout << endl << "File " << fn << " could not be opened." << endl;
}
};
int main(int argc, char* argv[])
{
try
{
char ifn[255], ofn[255];
switch(argc)
{
case 1:
cout << "Enter the input file name. ";
cin >> ifn;
cout << "Enter the output file name. ";
cin >> ofn;
break;
case 2:
strcpy(ifn, argv[1]);
cout << "Enter the output file name. ";
cin >> ofn;
break;
case 3:
strcpy(ifn, argv[1]);
strcpy(ofn, argv[2]);
break;
default:
throw CommandLineException(2, argc - 1);
break;
}
ifstream i(ifn); if(!i) throw FileException(ifn);
ofstream o(ofn); if(!o) throw FileException(ofn);
int testmsg;
while (true)
{
if (i.eof()) break;
i >> testmsg;
cout << testmsg << " ";
}
o.close();
i.close();
}
catch(...)
{
cout << "Program terminated." << endl;
exit(EXIT_FAILURE);
}
return 0;
}