2013-01-18 2 views
3

나는 이상한 일이 일어나고 있으며 왜 그런 일이 일어나는지 잘 모르겠습니다. 기본적으로 fgetc를 사용하여 바이트 단위로 간단한 ASCII 파일의 내용을 가져와야합니다. 이상한 부분은 작동했지만 몇 가지 문자를 추가하고 갑자기 파일에없는 줄 바꿈을 추가하고 파일의 끝 부분을 읽습니다. 말 그대로 내가 한 모든 난 그냥 각 문자 밖으로C - fgetc를 사용하여 파일 끝을 읽는 중

temp_size = strlen(temp)-1; 
for(debug_k = 0; debug_k < temp_size; debug_k++){ 
    printf("%c", temp[debug_k]); 
} 

인쇄 확인 후

do { 
    temp = (char*) checked_realloc (temp, n+1); 
    e = fgetc(get_next_byte_argument); 
    temp[n] = e; 
    if (e != EOF) 
     n++; 
} 
while (e != EOF); 

그리고이었다 그리고 파일에 없었다 여분의 줄 바꿈을 추가 한 것을 제외하고는 제대로 모든 것을 출력합니다. 그 전에 나는 가지고 있었다

그러나 그 다음 그것은 알려지지 않은 약간의 바이트로 끝났다. 경우에 대비해 strlen (temp) -2를 시도했지만 특정 파일에 대해 작동했지만 끝에 "a"를 추가하면 다시 파손되었습니다.

저는 솔직히 엉망입니다. 왜 이렇게하는지 잘 모르겠습니다.

EDIT : checked_realloc은 단지 realloc이지만 빠른 검사를 통해 메모리가 부족하지는 않은지 확인합니다. 이 방법이 가장 효율적인 방법은 아니라는 것을 알지만, 왜 내가 여분의 바이트로 마술처럼 읽는 것 같아 걱정하고 있습니다.

+0

'strlen (temp)'가 작동하려면 파일 내용 다음에 종료 NUL 문자가 있어야합니다. 이 마지막 '\ 0'을 추가하는 코드를 표시하지 않았습니다. –

+0

checked_realloc()이 realloc 일 경우 읽기 전에 메모리를 0으로 초기화하십시오. –

+0

Oooooh ... 이런. 나는 그것에 대해 완전히 잊었다. 감사! 그건 그렇고,이 마지막 문자는 EOF이므로 NULL을 대체하거나 아니면 그냥 뒤따라야합니까? 시행 착오를 통해 알아낼 수는 있지만, – user1777900

답변

1

같은 작업을 작성하는 더 안전한 방법입니다 : 메모리를 할당하는 경우

  1. memset 함수 제로와 함께 사용하기 전에 메모리 대량 전에, 당신이 realloc 함수마다 realloc.And 0으로 초기화 할 수 있습니다.
  2. 메모리에 문자열을 액세스하거나 문자열 기능을 사용하려면 항상 NULL 바이트로 해당 메모리를 종료해야합니다.

    do{ 
        temp = (char*) checked_realloc (temp, n+1);//I guess you are starting n with 0? 
        temp[n]=0; 
        e = fgetc(get_next_byte_argument); 
        temp[n] = e; 
        if (e != EOF) 
         n++; 
    } while (e != EOF); 
    temp[n]=0; 
    n=0; 
    

나는 위의 코드를 변경하여 문제를 해결해야한다 같아요. 더 이상 strlen -1은 필요하지 않습니다. :)

건배.

+0

그 일을 한 것 같습니다! 이상하게도 내 파일에없는 개행 문자가 있지만 일관성이 있습니다. 아마도 새 줄이 어쩌면 횡설수설하는 것이 아닙니다. – user1777900

+0

Nope. OP는 fgetc로 e를 초기화하고 temp [n]을 e 값으로 저장합니다.OP가 EOF를 얻으면 n ++은 일어나지 않을 것이고 temp [n]은 while 조건에 도달하기 전에 EOF를 계속 포함 할 것이다. tem [n]은 EOF를 항상 포함한다 (루프가 다른 원인으로 종료되지 않는 한) ] = 0 while 루프는 temp [n]에 포함 된 EOF를 안전하게 덮어 씁니다. :) – askmish

0

문자열을 종료하는 것을 잊어 버린 것 같습니다. while 바로 뒤에 temp[n] = 0;을 추가하십시오.

관련 문제