Получить содержимое файла из определенной позиции в другую конкретную позицию
Я хочу часть содержимого файла, указав начало позиции и указав конец позиции.
я использую 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()?