※요약

fread : 개방된 파일에서 바이트 단위로 파일을 읽는다.



※함수 원형 및 설명

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
//buffer : 파일 데이터를 읽어서 저장할 버퍼의 포인터
//size_t : 항목의 사이즈
//count : 항목의 개수, 읽어올 횟수
//stream : 개방된 FILE 구조체 포인터
//반환값 : 실제로 읽은 데이터 항목의 개수, 에러 시 count보다 작은 수


※예제

이번 예제는 Point Cloud 프로그램에서 사용하는 *.ply파일을 읽는 예제다.

파일의 구조는 헤더와 데이터로 나눠져 있으며, 예제에 주석으로 헤더, 데이터 읽는 부분을 표시하였다.

파일 헤더의 내용은 포맷과 점의 개수 표시, 데이터 타입, 데이터 순서 등이고 

데이터의 내용은 헤더에 표시된 점 개수 만큼의 x, y, z, r, g, b 값이다.

데이터의 내용을 읽을 때 fread로 데이터 타입 만큼의 바이트를 읽는다.


Wisconsin-Madison Capital.ply


#include <stdio.h>

struct tagData
{
	float x;
	float y;
	float z;

	unsigned char red;
	unsigned char green;
	unsigned char blue;
};

int main( )
{	
	FILE *pFile = NULL;

	pFile = fopen( "d:\\Wisconsin-Madison Capital.ply", "rt+" );
	if( pFile == NULL )
	{
		//에러 처리
	}
	else
	{
		tagData	*Data;
		int		nVertexCnt=0;

		{//헤더 읽기
			fscanf( pFile, "%*s \n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %d\n", &nVertexCnt );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s %*s %*s\n" );
			fscanf( pFile, "%*s \n" );
		}
		
		Data = new tagData[ nVertexCnt ];

		{//데이터 읽기
			for( int i=0 ; i<nVertexCnt ; ++i )
			{
				fread( &Data[ i ].x, sizeof( float ), 1, pFile );
				fread( &Data[ i ].y, sizeof( float ), 1, pFile );
				fread( &Data[ i ].z, sizeof( float ), 1, pFile );

				fread( &Data[ i ].red, sizeof( unsigned char ), 1, pFile );
				fread( &Data[ i ].green, sizeof( unsigned char ), 1, pFile );
				fread( &Data[ i ].blue, sizeof( unsigned char ), 1, pFile );
			}
		}
		fclose( pFile );
	}

	return 0;
}


+ Recent posts