은 내가 파일
103.45
123.45
456.67
......
읽기 데이터
fread()를 사용하여 이러한 데이터를 부동 소수점 숫자 배열에 직접 저장하는 방법을 궁금합니다. 나는 그것이 포인터를 사용하는 것이 어렵지 않다고 생각하지만 나는 그들과 잘 맞지 않는다. 아무도 말해 줄 수있는 방법
은 내가 파일
103.45
123.45
456.67
......
읽기 데이터
fread()를 사용하여 이러한 데이터를 부동 소수점 숫자 배열에 직접 저장하는 방법을 궁금합니다. 나는 그것이 포인터를 사용하는 것이 어렵지 않다고 생각하지만 나는 그들과 잘 맞지 않는다. 아무도 말해 줄 수있는 방법
fread
은 가지고있는 파일의 형식을 구문 분석하지 않으므로 사용할 수 없습니다. fread
은 바이트를 바이트 배열로 읽어 들이기 때문에 사람이 읽을 수있는 십진수 형식으로 작성된 숫자 만 사용하면됩니다.
난 당신이 끝을 명중 여부 및/또는 feof
확인할 실패, ferror
에, 이것은 당신이 사용할 수있는 가장 직접적인 방법을 포맷하면 반환 값을 확인해야되고, 루프에서 fscanf
를 사용하는 것을 생각하고 파일 또는 일부 다른 오류가 발생했습니다.
데이터 파일이 바이너리 fromat에 있지 않으면 사용자가 파일을 저장할 수 없습니다. 당신은 plaintext 파일을 보여주고 있습니다 : 배열로 가져 오기 위해서는 몇 가지 작업을해야합니다 : 배열에 필요한 항목의 양 (라인 수?)을 찾고, 배열을 할당 한 다음 변환하고 각 값을 배열에 넣으십시오. 예를 들어 scanf를 사용하여 변환을 수행 할 수 있습니다.
ASCII 형식의 파일 인 것처럼 보이므로 다음 전략을 게시합니다. 그러나 파일에 바이너리 데이터가 포함되어있는 것 같습니다. 이 가정은 fread()로 읽으려고한다는 사실에 근거합니다.
파일에서 한 번에 한 줄씩 읽기를 계속하고 파일에서 입력 된 문자열을 구문 분석하여 파일이 EOF를 반환 할 때까지이 작업을 수행하십시오.
아니요 파일은 각 행에이 값이있는 텍스트 파일입니다.지금까지 파일을 열고 파일 크기를 얻는 방법을 알아 냈습니다. 이제 어떻게 부동 소수점 배열에 메모리를 할당하고 텍스트 파일에서 한 번에 하나씩 읽어야합니까? – sfactor
당신이 필요 확실하지 그 밖의 무엇, 그러나 이것은 문제의 본질을 해결 :
int j = 0;
double flts [20000];
while (!feof(f))
{
if (fscanf (f, "%g", &flts [j]) == 1)
++j; // if converted a value okay, increment counter
}
답장을 보내 주신 모든 분들께 감사드립니다 ... 저는 부동 소수점 배열에 값을 가져올 수있었습니다 ....하지만 이제 문제는 배열의 값이 정밀도가 더 높다는 것입니다. 예 : 107.94는 107.940002로 저장됩니다. 105.76 105.760002로 저장됩니다. 105.22는 105.220001 으로 저장됩니다.이 여분의 정밀도는 어디에서 오는가? ... 실제 데이터에는 소수점 2 자리의 정밀도 만 있습니다. 나는 fscanf (f, "% 0.2f", & data [i])를 시도했다 .... 그러나 이것은 작동하지 않는다? – sfactor
'float'의 배열에로드되어 say % 10g를 사용하여 표시되는 경우, 이는 정밀도 부족으로 볼 수있는 노이즈의 종류입니다. 'float'는 6 ~ 7 자리의 유효 자릿수를가집니다. 'double '은 15 ~ 16 자리의 유효 자릿수를가집니다. – wallyk
이 파일을 사용 fgets()
및 sscanf()
에서 데이터를 읽을 수 있습니다.
/* needs validation and error checking */
fgets(buf, sizeof buf, fp);
sscanf(buf, "%f", &tmp);
부동 소수점 수를 관리하려면 두 가지 옵션이 있습니다.
/* 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);
+1을 malloc/realloc에 던지기 위해서 +1 –
+1,'realloc' 다음에'* tmp'를 체크합니다. – Unheilig
가변 장 배열에 대한 사용
malloc()
,realloc()
과 친구 모두 다른 제정신이되고, 그가 캐스트 할 수 있습니다 fread에 필요한 byte *로 float 배열 –그는 할 수는 있지만 입력 파일이 fwrite가있는 유사한 스타일로 만들어진 바이너리 덤프 인 경우 유효한 값을 가진 float 배열을 채우기 때문에 작동하지 않습니다. sfactor가 설명하는 것은 사람이 읽을 수있는 10 진수 형식의 한 줄에 하나의 플로트 텍스트 파일입니다. –
예, 그의 질문에 상충되는 정보가 있습니다. –