В C ++ есть способ перейти к определенной строке в текстовом файле? - PullRequest
21 голосов
/ 06 марта 2011

Если я открываю текстовый файл с помощью fstream, есть ли простой способ перейти к определенной строке, например строке 8?

Ответы [ 4 ]

35 голосов
/ 06 марта 2011

Цикл вашего пути туда.

#include <fstream>
#include <limits>

std::fstream& GotoLine(std::fstream& file, unsigned int num){
    file.seekg(std::ios::beg);
    for(int i=0; i < num - 1; ++i){
        file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
    }
    return file;
}

Устанавливает указатель поиска file на начало строки num.

Тестирование файла со следующим содержимым:

1
2
3
4
5
6
7
8
9
10

Тестовая программа:

int main(){
    using namespace std;
    fstream file("bla.txt");

    GotoLine(file, 8);

    string line8;
    file >> line8;

    cout << line8;
    cin.get();
    return 0;
}

Выход: 8

6 голосов
/ 06 марта 2011

Если каждая строка имеет одинаковую длину, вы можете использовать istream :: seekg (), чтобы перейти к месту и прочитать оттуда.

3 голосов
/ 23 февраля 2015

Вот рабочий и аккуратный пример с std::getline(), если строки имеют одинаковую длину:

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

const int LINE = 4;

int main() {
std::ifstream f("FILE.txt");
std::string s;

for (int i = 1; i <= LINE; i++)
        std::getline(f, s);

std::cout << s;
return 0;
}
0 голосов
/ 06 марта 2011

В общем, нет , вы должны идти, используя стратегию, аналогичную той, что Xeo показывает .

Если как netrom говорит Вы знаете, что линии имеют фиксированную длину, да .

И даже если длины линий не известны заранее, но (1) вам захочется много прыгать и(2) вы можете гарантировать, что никто не возится с вашим файлом, в то же время вы можете сделать один проход для формирования индекса и использовать его после этого.

...