2017-11-17 19 views
1

그래서 어떤 텍스트로 파일을 읽고 그 파일을 읽고 배열에 저장하는 기능을 원합니다. 몇 가지 코드를했는데 동적 배열을 인쇄 할 때 쓰레기 값을 인쇄합니다 : < help.C 언어 -> 동적 배열에 파일 읽기

char* read_message(char *filename) 
{ //gets the PATH of the txt file 
    char *file_contents; 
    long input_file_size; 
    FILE *input_file = fopen(filename, "r"); 
    if(input_file == NULL)       
    { 
     return NULL; 
    } 
    fseek(input_file, 0, SEEK_END);  
    input_file_size = ftell(input_file);   
    rewind(input_file);       
    file_contents = (char*)malloc(input_file_size+1 * (sizeof(char)));  
    fread(file_contents, input_file_size, 1, input_file); 
    printf("%s",file_contents);//----Prints crap-------- 
    fclose(input_file); 
                // returns the address to the array of strings 
    return file_contents;  
}  
+5

코드의 이미지가 아닌 여기에 코드를 게시하십시오. – AntonH

+4

코드를 텍스트로 게시하십시오. 텍스트 그림이나 텍스트 그림으로 연결되는 링크가 아닙니다. 또한 입력, 예상 출력 및 실제 출력을 게시하십시오. – dbush

+0

그냥 궁금 해서요. 왜 'input_file_size + 1'을 할당 했습니까? 결국 그것의 '+ 1'은 근본적입니다 (@dbush [answer] (https://stackoverflow.com/a/47359654/2436175)를보십시오),하지만 당신이 그렇게하지 않았다면 어떻게 생각해 냈는지 궁금합니다. 종료 문자에 대해 알고 있어야합니다. – Antonio

답변

1

파일의 내용을 char 배열로 읽습니다. 그 시점에서 당신은 아직 문자열을 가지고 있지는 않지만 문자의 배열을 가지고 있습니다. 왜냐하면 끝에 null 바이트가 없기 때문입니다.

printf을 사용하여이 배열을 인쇄하면 할당 된 메모리 세그먼트 끝에있는 초기화되지 않은 바이트를 읽습니다. 할당 된 메모리 세그먼트의 끝에있는 초기화되지 않은 바이트를 읽습니다. 초기화되지 않은 바이트를 읽으면 undefined behavior이 호출됩니다. fread를 호출하면 읽을 수 있었는지 후 종료 널 바이트를 추가하지 않기 때문에

, 당신은 자신을 수행해야합니다

fread(file_contents, input_file_size, 1, input_file); 
file_contents[input_file_size] = 0; 
+0

나는 약간의 이상한 이유로 OP가 이미 올바르게 수행 된'input_file_size + 1 '할당의 중요성을 강조합니다. – Antonio

1

문제는 잘못된 printf() 직전이다.

file_contents = (char*)malloc(input_file_size+1 * (sizeof(char)));  
fread(file_contents, input_file_size, 1, input_file); 
printf("%s",file_contents);//----Prints crap-------- 

fread() 이진 읽기를 수행합니다. file_contents에 제로 종결자를 추가하지 않습니다. 파일에서 읽은 데이터에 값이 0 인 문자가없는 경우 printf() 호출에 정의되지 않은 동작이 있습니다.

또한 fread()은 일반적으로 파일이 이진 읽기 용으로 열린 것으로 추정합니다. open() 문은 이진 모드로 파일을 열지 않습니다.

malloc(input_file_size + 1 * (sizeof(char)); 

우선 순위는 곱셈에 간다, 그래서하는 것과 같습니다 :

당신이 쓴 :

0

또 다른 문제는 당신은 괄호를 추가해야

malloc(input_file_size + (sizeof(char)); 

.