-2

В файле всего 3 строки:

nstructfile2
АБВ
4

Однако getline почему-то бесконечно читает файл и ничего не возвращает переменной spec[i].name даже на первой строке (которая в файле – вторая)

rd.open(fn + "2");
                            if (!rd) {
                                rd.close(); clr(red); printf("\nОшибка! Невзоможно открыть таблицу специальностей"); Sleep(3000); Cont();
                            }
                            rd >> automata;
                            if (strcmp(automata, "nstructfile2") != 0)
                            {
        rd.close(); clr(крас); printf("\nОшибка! Таблица специальностей поверждена"); clr();  Cont(); switch (uchar OMG = Cont()) { case '1':goto rewrite_file; case '2': op = '0'; }
                            }
                            else {
                                for (i = 0; !rd.eof(); i++)
                                {
                                    getline(rd, spec[i].name); rd >> spec[i].mes; n2++;
                                }
                                bar(3);
                                rd.close();

Почему так происходит и как это исправить?

1 Answers1

2

Итак...

rd >> automata;

Считали словою В буфере - "\n".

Цикл, обрекающий на как минимум одно лишнее чтение, потому что eof срабатывает только после попытки читать за концом файла... Откуда, ну откуда, какой препод вот такому учит?!

for (i = 0; !rd.eof(); i++)
{

Считали пустую строку из буфера - остаток "\n"

     getline(rd, spec[i].name);

Пытаемся читать в, вероятно, int (конечно, зачем этих отвечающих баловать, расписывать им все? и так догадаются, что я написал до этого места!) строку, которая не число

     rd >> spec[i].mes;

Файл переходит в состояние fail (в самом деле, не царское это дело - проверять, правильно ли все прочитано!) и все дальнейшие операции с ним просто возвращают ошибку. Но, как мы уже решили - проверять ошибки - унизительно для настоящего программиста...

Как исправить?

Прочесть это и это, и, работая с файлами (и не только с ними), проверять, все ли в порядке...

Harry
  • 221,325
  • Спасибо за подробное разъяснение! Да, spec[i].mes – не символьный тип. Я не стал это писать, поскольку не знал, где ошибка; а если отвечаещему нужны подробности, то он спросит и я всё что нужно распишу. И проверки я не выполнял, конечно, по причине не знания – Титан Jan 03 '20 at 09:50