Получить содержимое файла из определенной позиции в другую конкретную позицию

Я хочу часть содержимого файла, указав начало позиции и указав конец позиции.

я использую seekg функция, чтобы сделать это, но функция определяет только начальную позицию, но как определить конечную позицию.

Я сделал код, чтобы получить содержимое файла от конкретной позиции до конца файла, и сохранить каждую строку в элементе массива.

ifstream file("accounts/11619.txt");
if(file != NULL){
   char *strChar[7];
   int count=0;
   file.seekg(22); // Here I have been determine the beginning position
   strChar[0] = new char[20];
   while(file.getline(strChar[count], 20)){
      count++;
      strChar[count] = new char[20];
}

Например
Ниже приводится содержимое файла:

11619.
Mark Zeek.
39.
beside Marten st.
2/8/2013.
0

Я хочу получить только следующую часть:

39.
beside Marten st.
2/8/2013.

3 ответа

Решение

Поскольку вы знаете начало и конец блока, который хотите прочитать из файла, который вы можете использовать ifstream::read(),

std::ifstream file("accounts/11619.txt");
if(file.is_open())
{
    file.seekg(start);
    std::string s;
    s.resize(end - start);
    file.read(&s[0], end - start);
}

Или если вы настаиваете на использовании голых указателей и управлении памятью самостоятельно...

std::ifstream file("accounts/11619.txt");
if(file.is_open())
{
    file.seekg(start);
    char *s = new char[end - start + 1];
    file.read(s, end - start);
    s[end - start] = 0;

    // delete s somewhere
}

Прочитайте ссылку на fstream. в seekg функции, они определяют некоторые ios_base вещи, которые вы хотите. Я думаю, что вы ищете:

file.seekg(0,ios_base::end)

Изменить: Или, возможно, вы хотите этого? (Взятый прямо из ссылки на Tellg, немного измененный, чтобы прочитать случайный блок, который я вынул из воздуха).

// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main () {
  std::ifstream is ("test.txt", std::ifstream::binary);
  if (is) {
    is.seekg(-5,ios_base::end); //go to 5 before the end
    int end = is.tellg(); //grab that index
    is.seekg(22); //go to 22nd position
    int begin = is.tellg(); //grab that index

    // allocate memory:
    char * buffer = new char [end-begin];

    // read data as a block:
    is.read (buffer,end-begin); //read everything from the 22nd position to 5 before the end

    is.close();

    // print content:
    std::cout.write (buffer,length);

    delete[] buffer;
  }

  return 0;
}

Сначала вы можете использовать

seekg()

чтобы установить позицию чтения, то вы можете использовать

read(buffer,length)

читать намерение.

Например, вы хотите прочитать 10 символов, начиная с 6-го символа в текстовом файле с именем test.txt. Ниже приведен пример.

#include<iostream>
#include<fstream>

using namespace std;

int main()
{
std::ifstream is ("test.txt", std::ifstream::binary);
if(is)
{
is.seekg(0, is.end);
int length = is.tellg();
is.seekg(5, is.beg);

char * buffer = new char [length];

is.read(buffer, 10);

is.close();

cout << buffer << endl;

delete [] buffer;
}
return 0;
}

но в вашей ситуации, почему бы не использовать getline()?

Другие вопросы по тегам