Вопрос по c++ – Читать файл задом наперед?

11

Есть ли способ прочитать файл в обратном порядке, строка за строкой, не просматривая файл с самого начала, чтобы начать чтение назад?

Вы можете прочитать строки файла вvector и переверни это. hmjd
@hmjd Это должен быть ответ, ИМО. jrok

Ваш Ответ

5   ответов
5

fseek() to seek to the end of the file, then call ftell() to get the length of the file. Alternatively you can get the file length by calling stat() or fstat()

Allocate a buffer pointer to the file size obtained in #1, above.

Read the entire file into that buffer -- you can probably use fread() to read the file all in one shot (assuming the file is small enough).

Use another char pointer to transverse the file from end to beginning of the buffer.

Error: User Rate Limit Exceeded
3

чтобы переместить указатель туда, куда вы хотите перейти. Затем прочитайте () некоторые данные из этой точки. Если вы хорошо знаете, как управлять буферами, то это должно быть довольно быстро, потому что вы можете читать и кэшировать данные, а затем искать предыдущие символы новой строки. Веселитесь с \ r \ n, который будет перевернут ...

- Обновление: некоторая проработка возможного алгоритма -

Это неверный код, но он должен дать вам представление о том, что я пытаюсь сказать здесь

Файл читает:

int fpos = in.size() - BUFSIZ;
char buf[BUFSIZ];
in.seek(fpos);
in.read(buf, BUFSIZ);
fpos -= BUFSIZ; // repeat until fpos < 0, although think of size % BUFSIZ != 0
// now buf has characters... reset buffer position
int bpos = BUFSIZ - 1;

Получение строки:

// first time you need to call the read
if(bpos == -1) do_a_read();
// getting string
std::string s;
while(bpos >= 0 && buf[bpos] != '\n') {
  s.insert(0, 1, buf[bpos]);
  --bpos;
}
// if bpos == -1 and buf[0] != '\n' then you need to read another BUFSIZ chars
// and repeat the previous loop...

// before leaving, skip all '\n'
while(bpos >= 0 && buf[bpos] == '\n') {
  --bpos;
}
return s;

Чтобы упростить \ r ', у вас может быть первый проход, который преобразует все "\ r"; \ n '. В противном случае все тесты \ n 'a; нужно также проверить на \ r '.

Error: User Rate Limit Exceeded\r\nError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded mezamorphic
8

возможная (довольно простая) альтернатива будет читать строки вvector, Например:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

int main()
{
    std::ifstream in("main.cpp");

    if (in.is_open())
    {
        std::vector<std::string> lines_in_reverse;
        std::string line;
        while (std::getline(in, line))
        {
            // Store the lines in reverse order.
            lines_in_reverse.insert(lines_in_reverse.begin(), line);
        }
    }
}

РЕДАКТИРОВАТЬ:

СогласноДжрокиЛоки Астарикомментарии,push_back() будет более эффективным, но строки будут в порядке файлов, поэтому обратная итерация (reverse_iterator) или жеstd::reverse() будет необходимо:

    std::vector<std::string> lines_in_order;
    std::string line;
    while (std::getline(in, line))
    {
        lines_in_order.push_back(line);
    }
Error: User Rate Limit Exceeded mezamorphic
Error: User Rate Limit Exceededpush_backError: User Rate Limit Exceeded
Error: User Rate Limit Exceededpush_backError: User Rate Limit ExceededreverseError: User Rate Limit Exceeded
Error: User Rate Limit Exceededreverse_iteratorError: User Rate Limit Exceededstd::reverse(lines_in_order.begin(), lines_in_order.end());Error: User Rate Limit Exceedediterator.
Error: User Rate Limit Exceededstd::reverseError: User Rate Limit Exceededreverse_iterator.
3


1) Искать до последней позиции 1
2) Получить последнюю позицию 1
3) Прочитайте символ и распечатайте его;
4) искать 2 поз назад;
5)repeat 3 &4 for last-1 раз;

    ifstream in;
    in.open("file.txt");
    char ch;
    int pos;
    in.seekg(-1,ios::end);
    pos=in.tellg();
    for(int i=0;i<pos;i++)
    {
        ch=in.get();
        cout<<ch;
        in.seekg(-2,ios::cur);
    }
    in.close();
12

отображенный в память файл и идти назад. ОС отобразит нужные части файла в обратном порядке.

Error: User Rate Limit Exceeded

Похожие вопросы