Я искал его везде, но я не могу понять, как использовать ios :: cur. Мне нужно прочитать весь файл кусками по 10 байт, записать эти байты в буфер, а затем записать этот буфер в другой файл. Для этого я отправляю первые 10 байтов, затем следующие 10 и так далее. Но как мне убедиться, что указатель начинается с позиции последней итерации?
char* data = 0;
int i = 0;
std::ifstream is("test.txt", std::ifstream::binary);
if (is)
{
is.seekg(0, is.end);
int size = is.tellg();
cout << size << endl;
ofstream obj;
obj.open("new.txt");
while (!is.eof())
{
for (; i <= size;)
{
is.seekg(i, is.beg);
int sz = is.tellg();
// cout<<sz<<endl;
data = new char[sz + 1]; // for the '\0'
is.read(data, sz);
data[sz] = '\0'; // set '\0'
cout << " data size: " << strlen(data) << "\n";
cout << data;
i = i + 10;
}
obj.close();
}
}
Вам не нужно менять положение файлов.
Позиции файла обновляются после каждой операции чтения.
Вы должны использовать два файловых объекта, один для ввода, другой для вывода.
В обоих случаях позиции файла обновляются после каждой операции чтения и записи.
Редактировать 1: Упрощенный пример
#define BUFFER_SIZE 16
unsigned char buffer[BUFFER_SIZE];
//...
while (input_file.read((char *)buffer, BUFFER_SIZE))
{
output_file.write((char *)buffer, BUFFER_SIZE);
}
Если input_file имеет позицию со смещением 0, то после первого чтения позиция файла будет равна 16. Это можно проверить с помощью:
int read_file_position = input_file.tellg();
cout << "input file position: " << read_file_position << endl;
while (input_file.read((char *)buffer, BUFFER_SIZE))
{
read_file_position = input_file.tellg();
cout << "input file position: " << read_file_position << endl;
output_file.write((char *)buffer, BUFFER_SIZE);
}
Я думаю, что это можно упростить до этого:
char* data = 0;
int i = 0;
int size = 0;
int sz = 10;
std::ifstream is("test.txt", std::ifstream::binary);
std::ofstream obj;
data = new char[sz+1];
int read_sz = 0;
if (is)
{
obj.open("new.txt");
read_sz = is.tellg(); //we are at the beginning of the file now
while (!is.eof())
{
int old_read_sz = read_sz; // old position - before next read
is.read(data, sz);
read_sz = is.tellg(); // new position, we've read read_sz-old_read_sz bytes
data[read_sz-old_read_sz] = '\0'; // set '\0'
// I hope you wanted the two lines below only for debugging purposes :)
cout << " data size so far: " << read_sz << "\n";
cout << data << endl;
obj.write(data, read_sz-old_read_sz);
}
obj.close();
is.close();
cout << "total data size: "<< read_sz << endl;
}
После того, как вы прочли блок данных, ваш файловый курсор уже переместился за этот блок, поэтому вам не нужно перемещать его самостоятельно (и перемещение из текущей позиции в конец / начало и обратно может быть дорогостоящим — по времени — особенно если вы большой входной файл).
Кстати, вот учебник по теме: http://www.cplusplus.com/doc/tutorial/files/
Обновление: забыл, что is.read ()! = Старое чтение в стиле C: -}