Доброго времени суток. Была тут тема, в которой я не разобрался до конца. Код ниже проверяет баланс скобок в текстовом файле
В таком виде все работает нормально, при входном файле
{{}}
()
выдаст
( :1
) :1
{ :2
} :2
Но если заменить строку 18 на
то в выводе будет добавлен один лишний символ, который последний в файле, в данном случае
( :1
) :2
{ :2
} :2
При этом, если в конец файла добавить пустую строку, второй вариант тоже нормально отработает. Объясните в чем разница... Заранее благодарю.
Код:
#include "StdAfx.h"
using namespace std;
int main(void)
{
setlocale(LC_ALL, "Russian");
ifstream in("cppcode.txt");
ofstream out("scanresult.txt");
if (in.is_open() && out.is_open())
{
int symbols[] = { 0, 0, 0, 0 }; // '(', ')', '{', '}'
while (!in.eof())
{
char symbol = static_cast<char>(in.get());
switch (symbol)
{
case '(':
{
symbols[0]++;
break;
}
case ')':
{
symbols[1]++;
break;
}
case '{':
{
symbols[2]++;
break;
}
case '}':
{
symbols[3]++;
break;
}
}
}
out << "( = " << symbols[0] << endl
<< ") = " << symbols[1] << endl
<< "{ = " << symbols[2] << endl
<< "} = " << symbols[3] << endl;
in.close();
out.close();
if (symbols[0] == symbols[1])
cout << "OK1" << endl;
else cout << "ERROR1" << endl;
if (symbols[2] == symbols[3])
cout << "OK2" << endl;
else cout << "ERROR2" << endl;
}
else cout << "Error opening files." << endl;
cin.get();
return 0;
}
{{}}
()
выдаст
( :1
) :1
{ :2
} :2
Но если заменить строку 18 на
Код:
char symbol;
in.get(symbol);
( :1
) :2
{ :2
} :2
При этом, если в конец файла добавить пустую строку, второй вариант тоже нормально отработает. Объясните в чем разница... Заранее благодарю.