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바이트이기 때문입니다.
아래 그림은 위 소스코드를 실행한 결과입니다.
첨부파일 소스코드를 확인할 수 있습니다.