C에서 생성 된 이진 파일에서 두 배를 읽는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/631607

  •  08-07-2019
  •  | 
  •  

문제

AC 프로그램은 연속적으로 이진 파일로 두 배가됩니다. 파이썬으로 읽고 싶습니다. 나는 사용을 시도했다 struct.unpack('d',f.read(8))

편집 : C에서 다음을 사용하여 임의의 이중 번호를 작성했습니다.

r = drand48();
fwrite((void*)&r, sizeof(double), 1, data);

이제 오류가 수정되었지만 첫 번째 값을 읽을 수 없습니다. 모두 0.000 .. 숫자는 3.90798504668055로 읽지 만 나머지는 괜찮습니다.

도움이 되었습니까?

해결책

나는 당신이 실제로 숫자를 올바르게 읽고 있다고 생각하지만 디스플레이에 의해 혼란스러워지고 있습니다. 제공된 파일에서 번호를 읽으면3.907985046680551e-14" - 이것은 거의 0이지만 (0.000000000000039 확장 형식으로) C 코드가 Python보다 정밀도로 인쇄하는 것으로 생각됩니다.

편집] 방금 C에서 파일을 읽으려고했는데 동일한 결과를 얻습니다 (약간 덜 정밀도 : 3.9079E-14) (printf ( "%g", val) 사용),이 값이 있다고 생각합니다. 틀렸다. 그것은 독서보다는 글쓰기 측면에서 일어났다.

다른 팁

"작동하지 않았다"에 대해 자세히 설명해 주시겠습니까? 명령이 충돌 했습니까? 데이터가 잘못 되었습니까? 실제로 무슨 일이 있었나요?

명령이 충돌 한 경우 :

  • 명령의 오류 출력을 공유하십시오

데이터가 단순히 잘못되면 :

  • 데이터를 생성하고 읽는 시스템이 동일한 엔디 니스를 가지고 있습니까? 하나가 빅 엔디언이고 다른 하나는 리틀 엔디언이라면 형식 문자열에 엔디 언 변환을 지정해야합니다.

  • 두 컴퓨터의 엔지니어가 동일하다면 데이터가 파일에 어떻게 기록되었는지 바로 그거죠? 알아? 그렇다면 파일에 기록 된 값은 무엇이며 잘못된 값은 무엇입니까?

먼저, 당신은 시도 했습니까? 간물? 아무도 파이썬 코드를 아직 보여준 사람이 없습니다 ... 여기에는 파이썬의 이진에서 읽기를위한 코드가 있습니다.

import Numeric as N
import array
filename = "tmp.bin"
file = open(filename, mode='rb')
binvalues = array.array('f')
binvalues.read(file, num_lon * num_lat) 
data = N.array(binvalues, typecode=N.Float)   

file.close()

여기서 F는 단일-정밀, 4 바이트 부동물, 숫자를 지정했습니다. 데이터가 항목 당 크기를 찾아 사용하십시오.

비 바이너리 데이터의 경우 다음과 같은 간단한 작업을 수행 할 수 있습니다.

   tmp=[]
   for line in open("data.dat"):
                tmp.append(float(line))
  • f.read(8) 8 바이트 미만을 반환 할 수 있습니다
  • 데이터는 다른 정렬 및/또는 엔지니어를 가질 수 있습니다.

    >>> for c in '@=<>':
    ...     print repr(struct.pack(c+'d', -1.05))
    ...
    '\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
    '\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
    '\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
    '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd'
    >>> struct.unpack('<d', '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd')
    (-6.0659880001157799e+066,)
    >>> struct.unpack('>d', '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd')
    (-1.05,)
    

그만큼 베스트 메소드는 ASCII 텍스트 파일을 사용하는 것입니다.

0.0
3.1416
3.90798504668055

그것은 휴대 가능하고 모든 종류의 부동 소수점 구현과 어느 정도까지 작동한다는 점에서.

a에서 원시 이진 데이터를 읽습니다 double의 메모리 주소는 전혀 휴대 할 수 없으며 다른 구현에서는 실패 할 수 없습니다.

물론 소형을 위해 이진 형식을 사용할 수 있지만, 그 형식의 휴대용 C 기능 쓰기는 스 니펫처럼 보이지 않습니다.

최소한 코드는 메모리 표현을 확인하는 일련의 IFS/IFDEF로 둘러싸여 있어야합니다 double현재 기계에서 사용하는 S는 Python 통역사가 기대하는 것과 정확히 일치합니다.

그러한 코드를 작성하는 것은 어려울 것이기 때문에 ASCII 텍스트의 쉽고 깨끗하고 휴대 가능하며 인간이 읽을 수있는 솔루션을 제안하는 이유입니다.

이것은 될 것입니다 나의 "최고"의 정의.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top