LabWindows/CVI 에서 Scan 함수를 이용한 서식된 입출력(Formatted I/O) – CSV 파일 처리

LabWindows/CVI 의 Scan 함수를 이용한 서식 입출력에 대해서 설명합니다.

먼저, 이 Scan 함수를 사용하기 위해서는 #include <formatio.h> 를 이용하여 Format I/O 라이브러리를 Include 하여야 합니다.

아래 소스코드 1-1 는 CSV(영어: comma-separated values) 의 문자열을 처리하는 방법을 예제로 보여줍니다.

본 글은 통상 C 언어에서는 strok 함수를 이용하여 처리하나, LabWindows/CVI 에서 처리하는 방법의 예를 보여줍니다.

먼저, 아래 예제는 CSV 문자열로 ‘,’ <- 콤마로 구분된 문자열을 처리하여 8바이트 double 변수의 배열로 저장하는 예제입니다.


// 소스코드 1-1
void CSV_STRING_TO_REALN()
{
	char *s;
	int n;
	double a[7]; /* a[7]  8-byte real numbers */
	s = "12.3, 45, 6.5, -1.3E-2, 4, 2.2, 3.1";
	Scan (s, "%s>%7f[x]", a);
	
	n = NumFmtdBytes();
	
	printf("NumFmtdBytes returned = %d\n",n);
	
	for(int i=0; i < 7; i++)
	{
		printf("[%d] %f\n",i,a[i]);	
	}

}

 

위 소스코드 1-1 에서 char *s 변수에는 총 7개의 ‘,’ 로 구분된 실수가 있습니다. 보통 텍스트 파일이나 문자열, 사용자의 입력을 통해 입력된 실수를 이제 Scan 함수를 이용하여 double 형 배열로 저장할 수 있습니다.

 

Scan 함수의 원형은 다음과 같습니다.

출처 : NI LabWindows/CVI Help

 

먼저 첫번째 인자로는 서식 입출력을 처리할 ‘source’ 를 입력합니다. 위 소스코드에서 ‘s’ 변수가 되겠습니다.

두번째 인자로는 formatString[] 입니다.

세번째 인자에 ‘….’ 은 이 함수가 가변 인자를 사용한다는 것을 알수 있습니다. 가변인자라는 함수의 전달 인수가 정해지지 않은 ‘가변’ 적인 함수라는 것을 의미합니다.

Scan (s, "%s>%7f[x]", a);

위 소스코드 1-1에서 Scan 함수의 두번째 인자인 “%s>%7f[x]” 부분은 서식 문자열입니다. 간단하게 입력된 ‘소스’ 에 대해, 처리하는 방법을 기술한 문자열 정도로 이해하면 됩니다.

먼저  이와 같은 포맷에 대해서는 “source_specs_and_literals > target_spec” 라는 형식을 취합니다.

따라서 %7f[x] 가 ‘target_spec’ 즉 출력 변수 서식이 되고, %s 가  ‘source_specs_and_literals’  가 됩니다.

 

상기 서술된 서식 문자열 “%s>%7f[x]” 이를 한글로 풀어쓰면

” 문자열로 입력된 변수에 대해서 7개의 실수 배열로 반환하라” 라는 뜻이 됩니다. 여기서 [x] 의 의미는 ‘discard terminator’ 로써 라이브러리에서 숫자 데이터를 탐색하다가 마지막에 나타나는

문자열을 종료 문자열로 인식시키고 해당 문자열을 건너 뛰도록 합니다. 따라서 ‘,’ 문자가 각 숫자(실수)의 종료 문자열로 인식되어, CSV 파일을 읽을 수 있도록 하는 것입니다.

‘f’ 문자열은 C 언어에서 printf 함수등과 같이 서식화된 문자열 출력상에서 실수를 표현할때 사용하던 %f를 그대로 계승했다고 보면 됩니다.

 


// 소스코드 1-2
void CSV_STRING_TO_INTEGER()
{
	char *s;
	int n;
	int a[5]; /* a[5]  4-byte integer numbers */
	s = "1, 2, 3, 4, 5";
	n = Scan (s, "%s>%5d[x]", a);
	
	n = NumFmtdBytes();
	printf("NumFmtdBytes returned = %d\n",n);
	
	for(int i=0; i < 5; i++)
	{
		printf("[%d] %d\n",i,a[i]);	
	}

}

소스코드 1-2 는 CSV 로 구분된 문자열에 대해서 정수형 배열에 저장하는 예를 보여줍니다. 소스코드 1-1과 다른점은 formatString[] 부분이

“%s>%5d[x]” 로 변경되었습니다. 위에서 소스코드 1-1을 설명할때와 마찬가지로, 이 의미를 한글로 해석하면

” 문자열로 입력된 변수에 대해서 5개의 정수 배열로 반환하라” 라는 뜻입니다. ‘d’ 문자열은 C 언어에서 printf 함수등과 같이 서식화된 문자열 출력상에서 정수를 표현할때 사용하던 %d를 그대로 계승했다고 보면 됩니다.

 

마지막으로 반복적으로 보여지는 NumFmtdBytes 함수는 우리가 Scan 함수에 전달했던 문자열에 대해서, 서식화한 바이트수를 반환합니다. 예를 들어 소스코드 1-2에서 서식화한 문자열의 길이는 13바이트 입니다.  이유는 s = “1, 2, 3, 4, 5”; 의 길이는 13바이트이기 때문입니다.

 

아래 그림은 위 소스코드를 실행한 결과입니다.

 

첨부파일 소스코드를 확인할 수 있습니다.

CSV Reader