Ошибка при построчном чтении файла

Вот код программы:

int main()
{
    string file1_name, file2_name;

    ifstream file1("file1.txt");
    ifstream file2("file2.txt");

    if (inputIsOpen(file1, file2)) //проверяет, обычным file.is_open()
    {
        string file1_buff((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>());
        string file2_buff((istreambuf_iterator<char>(file2)), istreambuf_iterator<char>());
        if (Equal(file1_buff, file2_buff))
        {
            cout << "Files are equal\n";
            file1.close();
            file2.close();
            return 0;
        }
        else
        {
            findTheDiscrepancy(file1, file2_buff);
            return 1;
        }
    }
}

На вход два файла, необходимо сравнить их содержимое. Проблема возникает в функции поиска несоответствий:

//За основу для сравнения берётся первый файл и сравнивается построчно с содержимым из второго файла
void findTheDiscrepancy(ifstream& file, string str)
{
    int i = 0;
    string line;
    while (getline(file, line)) // в этом моменте программа определяет файл пустым
    {
        if (str.find(line))
        {
            ++i;
        }
        else
        {
            cout << "File are different. Line number is " << i << endl;
            break;
        }
    }
}

Она должна возвращать номер строки, в которой было найдено несоответствие. Однако в помеченном комментарием месте программа перестаёт работать корректно. Мною было проверено, что если проделать те же самые действия, но в области видимости int main(), то программа будет работать так, как задумывалось:

int main()
{
    string file1_name, file2_name;

    ifstream file1("file1.txt");
    ifstream file2("file2.txt");

    string line;
    while (getline(file1, line))
    {
        ///в таком случае чтение происходит
    }
}

Знающие люди, помогите, пожалуйста, разобраться, почему так происходит


Ответы (2 шт):

Автор решения: avp

Когда вы вызываете в main findTheDiscrepancy(file1, file2_buff); file1 уже достиг EOF
(вот в этой строке

string file1_buff((istreambuf_iterator<char>(file1)), streambuf_iterator<char>());

).

Вам надо его переоткрыть (или отмотать на начало) перед вызоврм этой функции.

→ Ссылка
Автор решения: KoVadim

строкой

string file1_buff((istreambuf_iterator<char>(file1)), istreambuf_iterator<char>());

Вы читаете содержимое файла в строку. И указатель позиции в этом файле теперь указывает в самый конец. Логично, что если с него дальше читать, то ничего не прочитать. Поэтому getline и возвращает false (на самом деле там возвращается std::basic_istream, у которого вызывается operator bool()).

Что же делать? да банально перед повторным чтением перемотать в самое начало с помощью file.seekg(0); (можно где то в начале функции findTheDiscrepancy добавить).

→ Ссылка