2011-12-23 1 views
1

이진 파일에서 0x0D0A를 찾으려고하는데 0x00을 찾았을 때 strchr이 멈추고 올바른 위치를 얻지 못합니다.memchr 빈 파일

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <windows.h> 

main(){ 
    FILE *f; 
    long size; 
    char *buffer; 

    f = fopen(filename, "rb"); 
    if(f==NULL){fputs("File error",stderr); exit(1);} 

    // obtain file size 
    fseek(f, 0, SEEK_END); 
    size = ftell(f); 
    rewind(f); 

    // allocate memory to contain the whole file 
    buffer = (char*) malloc(sizeof(char)*size); 
    if(buffer == NULL){fputs("Memory error",stderr); exit(2);} 

    // copy the file into the buffer 
    if((size_t)fread(buffer,1,size,f) != size){fputs("Reading error",stderr); exit(3);} 
    fclose(f); 

    // get positions 
    char *p; 
    p = strchr(buffer, 0x0D0A); 
    while(p != NULL){ 
     printf("found at %d\n", p-buffer-1); 
     p = strchr(p+2, 0x0D0A); 
    } 

    free(buffer); 
    return 0; 
} 

업데이트를 작동하지 않는 이유

if(((char*) memchr(p+1, 0x0A, size))-1 == p)은 (이미 하나의 이유를 설명했습니다 가능한 이제

int *pos,i=0; 
char *p; 
p = (char*) memchr(buffer, 0x0D, size); 
while(p != NULL){ 
    if(((char*) memchr(p+1, 0x0A, size))-1 == p){ 
     pos[i++] = p-buffer-1; 
     printf("found at %d\n", pos[i-1]);// check 
    } 
    p = (char*) memchr(p+2, 0x0D, size); 
} 
+0

이유를 알면 왜 작동하지 않는지 묻습니다. –

+0

나는 그에게 구제를 요청하고 있다고 생각한다 – akappa

+0

파일에'mmap'을 사용하고 나서 @Mario의 해결책을 사용할 수 있습니다. – hochl

답변

4

이진 데이터는 문자로만 사용하기 위해 사용할 수 없습니다 (예로 memcpy()strcpy()).

당신은 단순한 루프를해야 할 것 :

unsigned int pos = 0; 

while(pos + 1 < size) // compare with +1 as we won't check the last char in the buffer 
{ 
    if(buffer[pos] = 0x0d && buffer[pos+1] == 0x0a) 
     printf("found at %d\n", pos); 
    ++pos; 
} 

는 또한 파일 크기에 따라 당신이 한 번에 메모리에 전체 파일을 읽을 수도 있습니다 점에 유의하십시오. 다른 실수는 aix의 대답을 참조하십시오.

3

잘 작동하지 않습니다 알려주세요 임베디드 NUL). 또 다른 이유는 끝에 NUL 문자를 추가하지 않는다는 것입니다. 세 번째 이유는 strchr에게주는 것은 0x0D0A이 아니라는 것입니다.

당신은 작업 (0x0D 검색)의 일부을 할 memchr를 사용할 수 있습니다. 이 길로 가면 0x0A을 직접 확인해야합니다.

+0

memchr가 첫 번째 부분을 해결했지만 4 0x0D0A가있는 빈 파일에서 8 위치를 반환합니다. –

+0

0x0A0이 아닌 0x0A를 찾습니다. –

+0

요청한 문자를 검색합니다. 그것은 더 이상, 더 이상 없습니다. 내 대답의 마지막 문장에서 설명한 것처럼 한 번에 두 개의 문자를 검색 할 수 없습니다. – NPE

7

'\ r'을 찾으려면 memchr을 사용하고 '\ n'이 다음 문자인지 확인하십시오.

+1

+1 항상 좋은 디자인을 사용하십시오. – hochl

0

memchar는 주소를 반환하고 0x0D의 첫 번째 accress의 주소를 찾은 다음 p에 저장하면 같은 주소에서 0x0A 또는 다른 0x0D를 찾을 수 없습니다. p와 그 문자의 반환 값을 derefencing하여 그들이 당신의 주소가 아닌 char를 찾고 있다고 가정 할 때 무엇을 가리키고 있는지보십시오.