Помимо очевидной проверки для argc != 2
Я не мог не исправить несколько худший код и очевидную ошибку:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main (int argc, char* argv[])
{
if (argc != 2)
{
cout << "ERROR. Invalid number of arguments\n";
return 1;
}
ifstream infile(argv[1]);
if (!infile) // covers a miss spelling of a fail name
{
cout << "ERROR. Did you make a mistake in the Spelling of the File\n";
return 1;
}
string STRING;
while(getline(infile, STRING))
cout << STRING << '\n'; // Prints out file line
return 0;
}
Вам не нужно вызывать ifstream::open
, просто используйте конструктор, также вам не нужно объявлять STRING
так рано и не инициализировать его именем файла, поскольку вы его не используете. Не забывайте, что это не C, вам не нужен полный беспорядок в начале каждой функции.
Во-вторых, проверка флагов потока часто плохая идея, просто проверьте !infile
, чтобы найти какие-либо ошибки. Но настоящая ошибка заключается в проверке infile.eof
в условии while, поскольку он устанавливается только после того, как getline
попытается прочитать конец файла, так что вы фактически напечатаете одну (возможно, пустую) строку слишком много. Просто проверьте возвращаемое значение getline
, чтобы найти ошибки или конец файла.
И не добавляйте символ новой строки в строку при выводе, просто поместите ее после строки. И последнее по порядку, но не по значению: нет необходимости в infile.close
, поскольку деструктор все равно его вызывает.