Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как скопировать бинарный файл через буфер, например в 1 Кб. / 16 сообщений из 16, страница 1 из 1
26.02.2014, 13:28
    #38572814
S0ME0NE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
Как скопировать бинарный файл через буфер, например в 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
26.02.2014, 13:45
    #38572850
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
Надо писать столько сколько прочитал.
...
Рейтинг: 0 / 0
26.02.2014, 14:58
    #38573001
S0ME0NE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
Dima TНадо писать столько сколько прочитал.Как это проверить?
...
Рейтинг: 0 / 0
26.02.2014, 15:37
    #38573077
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
выложу для потомков
Код: 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
26.02.2014, 15:49
    #38573100
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
Вроде в потоках есть gcount(), что бы смотреть реальное кол-во прочитанных байт.

http://www.cplusplus.com/reference/istream/istream/gcount/
...
Рейтинг: 0 / 0
26.02.2014, 15:54
    #38573106
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
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
26.02.2014, 15:57
    #38573111
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
А явно закрывать файлы уже дурной тон?
Потом переходим на Java, C# и радуемся утечки ресурсов )))
...
Рейтинг: 0 / 0
26.02.2014, 15:59
    #38573115
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
Leonid Kudryavtsev,

для С++ это дурной тон. это делает деструктор.
...
Рейтинг: 0 / 0
26.02.2014, 16:15
    #38573147
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
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
26.02.2014, 16:24
    #38573161
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.

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

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


Java 7, http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
...
Рейтинг: 0 / 0
01.03.2014, 08:56
    #38575914
klen_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
вариант по проще
Код: 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
01.03.2014, 11:27
    #38575942
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как скопировать бинарный файл через буфер, например в 1 Кб.
klen_,

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

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


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