2009-12-05 3 views
2

은 내가 파일
103.45
123.45
456.67
......
읽기 데이터

에서 형식의 일부 부동 소수점 데이터를로드해야하는 프로그램을 만드는 중이라서

fread()를 사용하여 이러한 데이터를 부동 소수점 숫자 배열에 직접 저장하는 방법을 궁금합니다. 나는 그것이 포인터를 사용하는 것이 어렵지 않다고 생각하지만 나는 그들과 잘 맞지 않는다. 아무도 말해 줄 수있는 방법

답변

2

fread은 가지고있는 파일의 형식을 구문 분석하지 않으므로 사용할 수 없습니다. fread은 바이트를 바이트 배열로 읽어 들이기 때문에 사람이 읽을 수있는 십진수 형식으로 작성된 숫자 만 사용하면됩니다.

난 당신이 끝을 명중 여부 및/또는 feof 확인할 실패, ferror에, 이것은 당신이 사용할 수있는 가장 직접적인 방법을 포맷하면 반환 값을 확인해야되고, 루프에서 fscanf를 사용하는 것을 생각하고 파일 또는 일부 다른 오류가 발생했습니다.

+0

가변 장 배열에 대한 사용 malloc(), realloc()과 친구 모두 다른 제정신이되고, 그가 캐스트 할 수 있습니다 fread에 필요한 byte *로 float 배열 –

+0

그는 할 수는 있지만 입력 파일이 fwrite가있는 유사한 스타일로 만들어진 바이너리 덤프 인 경우 유효한 값을 가진 float 배열을 채우기 때문에 작동하지 않습니다. sfactor가 설명하는 것은 사람이 읽을 수있는 10 진수 형식의 한 줄에 하나의 플로트 텍스트 파일입니다. –

+0

예, 그의 질문에 상충되는 정보가 있습니다. –

2

데이터 파일이 바이너리 fromat에 있지 않으면 사용자가 파일을 저장할 수 없습니다. 당신은 plaintext 파일을 보여주고 있습니다 : 배열로 가져 오기 위해서는 몇 가지 작업을해야합니다 : 배열에 필요한 항목의 양 (라인 수?)을 찾고, 배열을 할당 한 다음 변환하고 각 값을 배열에 넣으십시오. 예를 들어 scanf를 사용하여 변환을 수행 할 수 있습니다.

0

ASCII 형식의 파일 인 것처럼 보이므로 다음 전략을 게시합니다. 그러나 파일에 바이너리 데이터가 포함되어있는 것 같습니다. 이 가정은 fread()로 읽으려고한다는 사실에 근거합니다.

파일에서 한 번에 한 줄씩 읽기를 계속하고 파일에서 입력 된 문자열을 구문 분석하여 파일이 EOF를 반환 할 때까지이 작업을 수행하십시오.

+0

아니요 파일은 각 행에이 값이있는 텍스트 파일입니다.지금까지 파일을 열고 파일 크기를 얻는 방법을 알아 냈습니다. 이제 어떻게 부동 소수점 배열에 메모리를 할당하고 텍스트 파일에서 한 번에 하나씩 읽어야합니까? – sfactor

3

당신이 필요 확실하지 그 밖의 무엇, 그러나 이것은 문제의 본질을 해결 :

int j = 0; 
double flts [20000]; 
while (!feof(f)) 
{ 
    if (fscanf (f, "%g", &flts [j]) == 1) 
     ++j; // if converted a value okay, increment counter 
} 
+0

답장을 보내 주신 모든 분들께 감사드립니다 ... 저는 부동 소수점 배열에 값을 가져올 수있었습니다 ....하지만 이제 문제는 배열의 값이 정밀도가 더 높다는 것입니다. 예 : 107.94는 107.940002로 저장됩니다. 105.76 105.760002로 저장됩니다. 105.22는 105.220001 으로 저장됩니다.이 여분의 정밀도는 어디에서 오는가? ... 실제 데이터에는 소수점 2 자리의 정밀도 만 있습니다. 나는 fscanf (f, "% 0.2f", & data [i])를 시도했다 .... 그러나 이것은 작동하지 않는다? – sfactor

+0

'float'의 배열에로드되어 say % 10g를 사용하여 표시되는 경우, 이는 정밀도 부족으로 볼 수있는 노이즈의 종류입니다. 'float'는 6 ~ 7 자리의 유효 자릿수를가집니다. 'double '은 15 ~ 16 자리의 유효 자릿수를가집니다. – wallyk

4

이 파일을 사용 fgets()sscanf()에서 데이터를 읽을 수 있습니다.

/* needs validation and error checking */ 
fgets(buf, sizeof buf, fp); 
sscanf(buf, "%f", &tmp); 

부동 소수점 수를 관리하려면 두 가지 옵션이 있습니다.

  1. 사용 고정 된 크기의 배열

/* 1. use an array of fixed size */ 
float array[1000]; 

/* 2. use `malloc()`, `realloc()` and friends for a growable array */ 
float *array; 
array = malloc(1000 * sizeof *array); 
/* ... start loop to read floats ... */ 
    if (array_needs_to_grow) { 
     float *tmp = realloc(array, new_size); 
     if (tmp == NULL) /* oops, error: no memory */; 
     array = tmp; 
    } 
/* end reading loop */ 
/* ... use array ... */ 
free(array); 
+0

+1을 malloc/realloc에 ​​던지기 위해서 +1 –

+0

+1,'realloc' 다음에'* tmp'를 체크합니다. – Unheilig