2017-11-15 30 views
2

2 진 파일을 열어 5MB의 '1'을 쓰는 C++ 코드를 작성해야합니다.특정 크기의 파일에 const 패턴을 작성하십시오.

현재 내 코드는 다음과 같습니다

#define BYTES_BUFFER_SIZE_5MB (1024*1024*5) 

static char buffer[BYTES_BUFFER_SIZE_5MB]; 
memset(buffer, 0xff, BYTES_BUFFER_SIZE_5MB); 
ofstream myFile ("data.bin", ios::out | ios::binary); 
myFile.write(buffer, BYTES_BUFFER_SIZE_5MB); 

파일에 기입하기위한 memset -like 방법이 있나요, 그래서 버퍼 것을 방지 할 수 있습니까?

+2

'1024 * 1024 * 5' = 16 진수 'int'라면 메리 지옥. 컴파일 타임으로 평가할 수있는 상수 표현에 대해서는 신중해야합니다. – Bathsheba

+0

큰 버퍼를 사용하는 좋은 점은 시스템이 백그라운드에서 데이터 전송을 처리 할 수 ​​있다는 것입니다. 예를 들어 드라이버는 DMA 프로세서를 사용하여 데이터를 하드 드라이브로 전송할 수 있습니다. CPU가 메모리를 읽거나, 장치에 데이터를 쓰거나, 반복해야하는 번거 로움을 덜어줍니다. –

+0

각 트랜잭션에 오버 헤드가 있습니다. 최적의 솔루션은 트랜잭션 당 데이터 크기를 최대화하는 것입니다. 오버 헤드는 드라이브 회전, 드라이브 회전, 섹터 위치 지정 등일 수 있습니다. –

답변

1

더 작은 버퍼를 사용하여 루프를 for 루프로 여러 번 쓸 수 있습니다.

는 5MB입니다 작성해야 할 경우에 당신은write() 방법은 정말 느린 될 수

#define BYTES_SIZE_5MB (5242880) // Bathsheba comment have to be considered 
#define BUFFER_SIZE (1024) // Chunk size to be written (this is an arbitrary amount) 

static char buffer[BUFFER_SIZE]; 
ofstream myFile ("data.bin", ios::out | ios::binary); 
int i, repetitions = BYTES_SIZE_5MB/BUFFER_SIZE; 
memset(buffer, 0xff, BUFFER_SIZE); 
for (i=0; i < repetitions; ++i) 
    myFile.write(buffer, BYTES_BUFFER_SIZE_5MB); 
myFile.close(); 

주 같은, 그것은 더 큰 청크 크기하고 write 덜 할 것입니다 그 방법을 선택하는 것이 좋습니다 할 수 호출 속도가 향상되어 프로그램 속도가 향상됩니다.

0

더 간단하지는 않지만 memory-mapped files을 사용할 수 있습니다. 그들은 당신이 요구 한 것을 정확하게 제공합니다 - 마치 메모리에 쓰는 것처럼 파일을 쓸 수 있습니다.

각 운영체제마다 다른 API가 있지만 휴대용 지원을 제공하는 라이브러리가 몇 가지 있습니다.

1

나는 우리가 스트림 조종 한 줄에서이 작업을 수행 할 수 있다고 생각 :

fout << std::setw(BYTES_BUFFER_SIZE_5MB - 1) << std::setfill(char(0xFF)) << char(0xFF); 
  • setw는 기본적
  • 로를 0xFF를 작성하기 위해
  • setfill을 작성하는 바이트 수를 설정

그런 식으로 우리는 버퍼를 사용하지 않습니다. 유일한 위험은 많은 바이트를 쓰고 싶은 경우 setw으로 전화 할 때 int이 넘칠 위험이 있습니다.