Как построчно прочитать файл c++ с конца вверх?

Пользователь

от miguel_ritchie , в категории: C/C++ , 8 месяцев назад

Как построчно прочитать файл c++ с конца вверх?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от vladimir , 8 месяцев назад

@miguel_ritchie 

В C++ можно построчно прочитать файл с конца вверх, используя следующий подход:

  1. Откройте файл в двоичном режиме (std::ifstream file("filename", std::ios::binary)).
  2. Переместите позицию указателя чтения в конец файла (file.seekg(0, std::ios::end)).
  3. Получите текущую позицию указателя чтения (std::streampos fileSize = file.tellg()).
  4. Переместите позицию указателя чтения на последний символ (file.seekg(fileSize - 1)).
  5. Создайте цикл, который будет продолжаться до тех пор, пока позиция указателя чтения больше или равна нулю.
  6. В теле цикла: Читайте символ из позиции указателя чтения (char ch; file.get(ch)). Если символ является символом новой строки (ch == ' '), то обработайте прочитанную строку. Переместите позицию указателя чтения на предыдущий символ (file.seekg(-2, std::ios::cur)).


Пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include 
#include 
#include 

int main() {
    std::ifstream file("filename", std::ios::binary);

    file.seekg(0, std::ios::end);
    std::streampos fileSize = file.tellg();
    file.seekg(fileSize - 1);

    std::string line;
    while (file.tellg() >= 0) {
        char ch;
        file.get(ch);

        if (ch == '
') {
            // Обработать прочитанную строку
            std::cout << line << std::endl;
            line.clear();
        } else {
            line = ch + line;
        }

        file.seekg(-2, std::ios::cur);
    }

    // Обработать последнюю строку (если не было символа новой строки)
    if (!line.empty()) {
        std::cout << line << std::endl;
    }

    file.close();

    return 0;
}


Обратите внимание, что данный подход является достаточно медленным и неэффективным для больших файлов, поскольку требуется обратное перемещение указателя чтения на каждой итерации. В таких случаях более оптимальным решением может быть использование других алгоритмов или структур данных для обработки файлов.