2009-10-21 5 views
2

Windows 사용Labwindows/CVI C 프로그램이 2573 번호를 싫어하게 만들 수 있습니까?

그래서 이진 파일에서 부호없는 int 데이터 값 목록을 읽습니다. 파일에는 여러 개의 데이터 세트가 순차적으로 나열되어 있습니다. 여기의 시작 숯불 * 가리키는에서 하나의 데이터 집합을 읽을 수있는 기능입니다 :

function read_dataset(char* stream, t_dataset *dataset){ 

    //...some init, including setting dataset->size; 

    for(i=0;i<dataset->size;i++){ 
     dataset->samples[i] = *((unsigned int *) stream); 
     stream += sizeof(unsigned int); 
    } 
    //... 
} 

경우이 같은 맥락에서 read_dataset : 내 루프가 표시 될 때까지

//... 
char buff[10000]; 
t_dataset* dataset = malloc(sizeof(*dataset)); 
unsigned long offset = 0; 

for(i=0;i<number_of_datasets; i++){ 

    fseek(fd_in, offset, SEEK_SET); 

    if((n = fread(buff, sizeof(char), sizeof(*dataset), fd_in)) != sizeof(*dataset)){ 
     break; 
    } 

    read_dataset(buff, *dataset); 

    // Do something with dataset here. It's screwed up before this, I checked. 


    offset += profileSize; 
} 
//... 

모든 것이 순조롭게 진행 갑자기 무작위로 거대한 숫자가 뱉어 내기 시작합니다. 당신이 그 진수 번호가 의심스러운 생각한다면

... 
1831 
2229 
2406 
2637 
2609 
2573 
2523 
2247 
... 

해야 어떤 예를 들어

, 당신 말이 맞아,

... 
1831 
2229 
2406 
2637 
2609 
0xDB00000A 
0xC7000009 
0xB2000008 
... 

된다. 변경된 값의 16 진수 값을 알고 보니 정말 잘 알고 :

2573 -> 0xA0D 
2523 -> 0x9DB 
2247 -> 0x8C7 

그래서 분명히이 번호 2573는 바이트를 얻기 위해 내 스트림 포인터가 발생합니다. 이것은 다음 데이터 집합이로드되고 구문 분석 될 때까지 남아 있으며 신은 2573 번을 포함하는 것을 금지합니다.이 문제가 발생한 지점을 확인하고 2573에서 각 체크를 시작했습니다.

나는 ' 나는 C의 세계에서 그렇게 재능이 없습니다. 무엇이이 문제를 야기 할 수 있었는지는 완전히 불투명합니다.

답변

11

메모리에서 바이트를 얻은 방법 (스트림이 가리키는)이나 실행중인 플랫폼을 지정하지 않았지만, Windows 및 C stdio 라이브러리 호출을 사용했습니다 fopen(filename "r");fopen(filename, "rb");을 사용해보십시오. Windows 및 MS-DOS에서 fopen()은 파일 모드에 "b"를 추가하지 않으면 파일의 Unix 스타일 "\ n"으로 MS-DOS 줄 끝 "\ r \ n"(16 진수 0x0D 0x0A)을 변환합니다 바이너리를 나타냅니다.

+0

좋은 점 (그리고 잘된 것 - 15 자로 만들기 위해서!) –

+0

고마워요. 제 방식의 오류를 이해합니다. (예, "b"를 잊었습니다.) –

+0

나는 occasonally "b"를 잊어 버렸고, 증상을인지했다. –

0

몇 가지 관련성이 없습니다.

sizeof (* dataset)는 생각하지 않는 것입니다.

당신은 그러나 당신이이 (또는 적어도 내가 왜 이해가 안주는 하나 개의 매개 변수를받는 함수를 호출하는 방법을 이해하지 않습니다마다

읽기에 추구 사용할 필요가 없습니다 귀하의 컴파일러가 객체가 아닙니다)

+0

내가 입을 다물 수도 있지만 코드에서 몇 가지 사항을 남겨 두었습니다. 각 데이터 세트에는 파일 수간에 일관성이없는 샘플 수를 나타내는 작은 헤더가 있습니다. 따라서 t_dataset은 내가 만날 것으로 예상되는 가장 큰 데이터 세트의 크기입니다. 그건 틀 렸지만, 제 변호에서 나는 그것을 쓰지 않았습니다. 따라서 fseek는 오버 슛을 보정합니다. –

관련 문제