powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как скопировать бинарный файл через буфер, например в 1 Кб.
16 сообщений из 16, страница 1 из 1
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38572814
S0ME0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как скопировать бинарный файл через буфер, например в 1 Кб. Или почему неправильно работает метод eof() из std::ifstream

Добрый день уважаемые. (знатоки именно C++) вопрос именно к Вам.
Копирую файл в цикле, размером 4 Кб, через буфер в 1 Кб, а на выходе получаю 5 Кб

Думал что будет 4 такта в этом цикле, а этих тактов оказалось 5.
И выходной файл получается не 4096 байт, а 5120 байт. (то есть ровно лишний килобайт)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
std::ifstream input_File( "text.txt", ios::binary );
std::ofstream outputFile("text2.txt", ios::binary );

unsigned short int buffer1024 = 1024;	// по скольку символов читаем за один цикл

char * buffer = new char [buffer1024];

unsigned int i;
i=0;

while ( !input_File.eof() ) // Пока не конец файла
{
	i++;
	input_File.read( buffer, buffer1024 ); //inputFile >> zapis; при чтении таким способом теряется пробелы почему-то
	outputFile.write(buffer, buffer1024 ); //outputFile << zapis;
}

input_File.close();
outputFile.close();



Копировать надо именно по частям. В этом весь интерес.
Хочется понять почему так происходит и как быстро и правильно скопировать любой файл и при этом хочется отображать процент скопированного.
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38572850
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо писать столько сколько прочитал.
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573001
S0ME0NE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНадо писать столько сколько прочитал.Как это проверить?
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573077
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выложу для потомков
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
unsigned short int buffer4096 = 4096;	// по скольку символов читаем и пишем
unsigned int total_parts = 0;
double part1 = 0;
double intpart=0;
if (fileSize > buffer4096)	{
	part1 = (double) fileSize / buffer4096;
	modf (part1, &intpart);
	total_parts = intpart;
}

char * buffer = new char [buffer4096];
unsigned int i, pos;	//     4 байта, значения от 0 до 4 294 967 295
i=0;

while (! input_File.eof())  // Пока не конец файла
{
	i++;
	if (i > total_parts) {
		pos=input_File.tellg(); // Определяет текущее положение
		buffer4096 = fileSize - pos;
		if (buffer4096 > 0)	{
			char* buffer_last = new char [buffer4096];
			input_File.read( buffer_last, buffer4096 );
			outputFile.write(buffer_last, buffer4096 );
		}
		break;
	}
	else
	{
		input_File.read( buffer, buffer4096 );
		if (! input_File.fail()) {
		outputFile.write(buffer, buffer4096 );
		}
	}
}
input_File.close();

...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573100
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде в потоках есть gcount(), что бы смотреть реальное кол-во прочитанных байт.

http://www.cplusplus.com/reference/istream/istream/gcount/
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573106
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_,

не знаю, почему у тебя так сложно вышло

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
#include <fstream>
#include <iostream>

int main(int argc, char *argv[])
{
    if( argc < 3 ) {
        std::cerr << "Usage: " << argv[0] << " input_file_name output_file_name\n";
        return 1;
    }
    std::ifstream in(argv[1], std::ios::binary);
    if( !in ) {
        std::cerr << "Error: Cannot open file " << argv[1] << " for read\n";
        return 2;
    }
    std::ofstream out(argv[2], std::ios::binary);
    if( !out ) {
        std::cerr << "Error: Cannot open file " << argv[2] << " for write\n";
        return 3;
    }
    std::cout << "Copying " << argv[1] << " to " << argv[2];
    const size_t capacity = 1024;
    char buffer[capacity];
    while(!in.eof()) {
        std::cout << '.';
        in.read(buffer, capacity);
        out.write(buffer, in.gcount());
    }
    std::cout << "\nDone\n";
}
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573111
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А явно закрывать файлы уже дурной тон?
Потом переходим на Java, C# и радуемся утечки ресурсов )))
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573115
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

для С++ это дурной тон. это делает деструктор.
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573147
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

кстати и для Java эта проблема уже не актуальна

Код: java
1.
2.
3.
try (FileReader fs = new FileReader(path); BufferedReader br = new BufferedReader(fs)) {
             ...
       	}



и для C#


Код: c#
1.
2.
3.
4.
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), TextReader tr= new StreamReader(fs))
    {
         ...
    }
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573161
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Анатолий Широков...кстати и для Java эта проблема уже не актуальна...try ( .... )...

С какой версии?
Где можно почитать про особое поведение try(....) или я что-то недопонимаю.
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38573168
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevАнатолий Широков...кстати и для Java эта проблема уже не актуальна...try ( .... )...
С какой версии?
Где можно почитать про особое поведение try(....) или я что-то недопонимаю.


Java 7, http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38575914
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант по проще
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#include "windows.h"
#include <iostream>
#include <fstream>
//#include <share.h>
using namespace std;

string filepath1 = "text.txt";
std::ifstream input_File( filepath1.c_str(), ios::binary );	// _SH_DENYWR	- все могут только читать

   if ( ! input_File ) {
	MessageBox(0, "ошибка: не могу открыть входной файл", " Error", MB_OK);
	return 0;
   }

string filepath2 = "text2.txt";
std::ofstream outputFile( filepath2.c_str(), ios::binary );

   if ( ! outputFile ) {
	MessageBox(0, "ошибка: не могу СОЗДАТЬ вЫходной файл", " Error", MB_OK);
	return 0;
   }

unsigned short int buffer4096 = 4096;	// по скольку символов читаем и пишем
char * buffer = new char [buffer4096];

while (! input_File.eof())
{
	input_File.read( buffer, buffer4096 );
	outputFile.write(buffer, input_File.gcount() );
}
input_File.close();
outputFile.close();
delete[] buffer;

...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38575942
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_,

проще, чем что?
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38575947
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий Широковпроще, чем что?чем то, что нагромоздил первый раз для потомков
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38575956
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
klen_,

где-то я уже видел этот упрощенный код.
...
Рейтинг: 0 / 0
Как скопировать бинарный файл через буфер, например в 1 Кб.
    #38668529
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толик, повезло что деструктор по чистой случайности вызвался в нужное время и в нужном месте. А то....
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как скопировать бинарный файл через буфер, например в 1 Кб.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]