2014-09-29 1 views
-3

내용을 [19000]에 복사하기 위해 mp3 파일을 읽고 싶습니다. 그런 다음 내용 [19000]을 소켓에 보내려고합니다.C에서 .mp3, .pdf 또는 .jpg 파일을 읽는 방법

그러나 strcat (contents, tmp)에서 세그먼트 오류가 발생합니다.

그러나 HTML 파일을 읽으면이 코드가 아무 문제없이 작동합니다.

.mp3 파일을 읽고 내용을 [19000]으로 복사하는 방법은 무엇입니까 ??

크기는 8MB입니다. 그것이 널 문자로 종료되어야 C 스타일의 문자열을 예상대로

FILE *fp; 
if ((fp = fopen("./test.mp3", "rb")) == NULL) { 
    fputs("Cannot open input file...\n", stderr); 
    exit(1); 
} 
char tmp[1024]=""; 
char contents[19000]=""; 

while (!feof(fp)) { 
    fread(tmp, 1, 1023, fp); 
    strcat(contents, tmp); 
} 

+3

이진 파일입니다. 왜 strcat인가? 어쨌든, fread를 이용한 블록 읽기에 대해서도 예제를 확인하십시오. –

+0

'strcat'는 연결 후 목적지 문자열에'char *'포인터를 리턴합니다; 너는 그것을 모으는 걸 놓쳤다. –

+0

@suneric 아니요, 이진 데이터이고 반환 값은 어쨌든 첫 번째 매개 변수와 같습니다. 게다가 fread는 NIL을 설정하지 않으므로 더 큰 텍스트 파일에서도 실패 할 것입니다. –

답변

1

strcat()는 문자열을 연결하는 데 사용됩니다. MP3 : s는 바이너리 파일입니다 ('rb'로 열어도). 사람에서 가 :

strcat와() 함수는 이명 령 문자열의 src 문자열을 추가, 이명 령의 끝에 널 바이트 ('\ 0') 쓰기, 오버 는 는 TERMI 추가 null 바이트를 나타냅니다. 문자열은 중복 될 수 없으며 이며 결과 문자열에는 결과에 충분한 공간이 있어야합니다.

strcat()는 "tmp"의 크기를 알지 못하며 tmp에 null 바이트 (0x00)가 없으면 충돌 할 때까지 계속 읽을 것입니다 (스택을 읽은 후).

memcpy()를 사용하십시오.

0

당신은 strcat()를 사용하지 말아야합니다. memcpy() 또는 memmove()을 사용하고 직접 오프셋을 계산해야합니다.

관련 문제