안녕하세요! C 텍스트파일 배열 관련 질문입니다.
C 극초보자 입니다ㅠ 구글링하다 도저히 힘들어서 글남깁ㄴㅣ다ㅠㅠ
실수형 데이터가 잔뜩 들어있는(1개의 행에 약 20개 실수가 있고 전체 35000행 정도 있습니다)
텍스트 문서를 C로 불러들여 그 중 원하는 열( 현재 1차원 배열로 불러들여 정확히 말하면 열은 아니고 원하는 번째(?) 입니다)의
값들로 연산을 하려고 합니다.
예를 들어
1.1 2.2 3.3 0.1 2.0
3.4 0.2 1.3 3.3 1.3
2.3 2.1 3.4 4.5 5.5
라는 정보를 담고있는 텍스트를 불러와 그중 1열 숫자(1.1, 3.4, 2.3)과 3열 숫자(3.3, 1.3, 3.4)
를 뽑아내 각각 1열은 데이터 곱하기 2와 3열은 데이터 나누기 2의 연산을 하고 싶다..라고 생각하시면 될 것 같습니다.
저정도 예제는 구조체로 할 수 있을것 같은데.. 실제 데이터는 구조체로 하기에 데이터의 개수가 너무 많아서
(100000행, 400열 정도 데이터도 불러와서 연산을 해야하는데 이왕 하는겸 같은 코드를 사용하려고 합니다ㅠ) 시도를 못해보고 있습니다.
현재 fgets함수로 텍스트 파일을 불러와 배열에 저장한 뒤, atof함수로 실수형으로 바꿔 계산하는 방법을 시도하고있는데
atof 함수는 배열의 첫 번째 숫자만 실수로 바꿔주는것으로 보여 그 후의 다른 숫자들로는 연산을 못하고있습니다ㅜㅜ
참고하실 코드 올려드리겠습니다. 답변주시면 감사하겠습니다!
#include
#include
#include
int main(void)
{
int state;
char hour [1000]; //행렬이 커서 일단 그냥 크게 뒀습니다.
int i;
double a, b;
FILE * file = fopen("test.txt", "r"); // test.txt파일 오픈
if(file==NULL){
printf("file open error!\n");
return 1;
}
for(i=0; i<100 && feof(file)==0; i++) //파일이 끝날 때 까지 반복
{
fgets(hour, sizeof(hour), file); // 파일의 1행에 해당되는 값을 배열 hour에 입력
puts(hour); // 배열 hour 출력
a = atof(hour); // 문자열을 실수형으로 변경
b = 3*a; // 연산의 예
printf("숫자출력 : %f, %f \n", a, b); //배열 hour의 0번째 숫자 및 연산결과 출력
}
state=fclose(file); //파일 닫음
if(state!=0){
printf("file close error!\n");
return 1;
}
return 0;
}
strtok 를 써보세요.
for () {} 블럭을 이렇게 바꾸시고,
while (fgets (hour, sizeof hour, file)) {
puts (hour);
printf ("%f\n", getColumn (hour, 0));
}
getColumn 함수를 정의하세요.
double getColumn (char hour[] , int col) {
char *token = strtok (hour, SEP);
while (col --) {
token = strtok (NULL, SEP);
}
return atof (token);
}
SEP 는 구분자 입니다. 헤더 밑 부분에 정당하게 #define 해주시면 됩니다.
#define SEP "\n, "
댓글 달기