오늘은 지난 시간에 strtok()함수로 문자열을 쪼개고 그 쪼갠 문자열을 숫자로 변환하여 숫자의 합을 구해 보았습니다. 실제 CSV 파일을 읽어와서 지난 시간의 했던 숫자의 합을 구현해 보는 것이 공부에 도움이 될 것 같다는 생각에 그냥 넘어 가려다가 post로 작성해 봅니다.
FILE *pFile = NULL;
pFile = fopen("test.csv", "r" ); //파일 열기
fclose( pFile ); //파일 닫기
파일을 읽기 위해서 위와 같은 코딩을 합니다. 딱 세줄이면 파일을 열고 닫을 수 있습니다. pFile에는 읽어 온 파일의 정보가 저장되어 있겠죠. 이 pFile에 저장된 정보를 어떻게 읽은 것인지만 정해서 읽으면 됩니다.
실험에서는 라인으로 읽고 읽는 글자의 범위는 대충 적당한 크기를 정해서 읽을 예정입니다.
그러면 CSV 파일이 정상적으로 읽어오는지 확인해 봅시다.
[test.csv]
10,20,30
40,50,60
70,80,90
[코딩]
#include
int main(int argc, char *argv[]) {
char str_tmp[1024];
FILE *pFile = NULL;
pFile = fopen("test.csv", "r" );
if( pFile != NULL )
{
while( !feof( pFile ) ){
fgets( str_tmp, 1024, pFile );
printf( "%s", str_tmp );
}
}
fclose( pFile );
return 0;
}
fgets()함수로 해서 라인으로 읽어오는데 pFile의 정보에서 최대 1024데이터 크기로 읽어옵니다. str_tmp에는 읽어온 데이터가 저장되게 됩니다. 참고로 반환값은 따로 변수를 선언하면 해당 읽어온 값을 반환값으로 받을 수 있습니다.
p = fgets( str_tmp, 1024, pFile );
이렇게 하면 읽어온 라인값은 p에 저장됩니다. 사용방법은 코딩하는 분들의 스타일에 맞게 코딩하시면 됩니다.
[결과]
지난 시간 post에 코딩한 소스를 오늘 파일읽기에 그대로 대입하여 실행을 시켜보겠습니다. 외부함수로 해서 별도록 보기 좋게 하려다가 그냥 main()함수 안에다 다 집어 넣었네요.
[코딩]
#include
#include
int main(int argc, char *argv[]) {
char str_tmp[1024];
char *p;
int b[3] = {0,0,0};
int cnt, sum, i;
FILE *pFile = NULL;
pFile = fopen("test.csv", "r" );
if( pFile != NULL )
{
while( !feof( pFile ) ){
fgets( str_tmp, 1024, pFile );
//printf( "%s", str_tmp );
cnt=0;
sum=0;
p = strtok(str_tmp, ",");
while(p != NULL){
b[cnt]=atoi(p);
cnt++;
p=strtok(NULL, ",");
}
for(i=0;i<cnt;i++){
sum+=b[i];
printf("%d ",b[i]);
}
printf("토큰수 : %d , 합 : %d\n", cnt, sum);
}
}
fclose( pFile );
return 0;
}
[결과]
정상적으로 CSV 파일을 읽어와서 각 데이터를 쪼개고 그 데이터를 원하는 계산을 수행 해 보았습니다.
strtok()함수의 원리를 생각하니 파일을 읽고 읽은 정보를 쪼개서 원하는 형태로 변환 시켜보고 싶은 생각이 문득 들어서 이렇게 실험을 해보았네요. 어떤 하나를 배우게 되면 그 원리를 잘 생각해보고 그 원리를 어디에 적용해 볼지 상상의 나래를 펼치면 이렇게 재밌는 실험을 할 수 있습니다.