2017-11-17 257 views
1

所以我有一个文件,作为一些文本,我希望我的函数读取该文件并将其存储在一个数组上。我做了一些代码,当我打印我的动态数组时,它会打印垃圾值:<帮助。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数组中。那时你还没有一个字符串,而是一个字符数组,因为末尾没有终止的空字节。

然后,当您使用printf来打印该数组时,它会在分配的内存段末尾读取未初始化的字节(可能还有几个字节,它不是已分配内存的一部分)。读取未初始化的字节将调用undefined behavior

,因为调用fread不添加什么阅读后终止空字节,你需要做的是自己:

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

我会强调分配'input_file_size + 1'的重要性,因为某些奇怪的原因,OP已经做得正确。 – 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。如果从文件读取的数据中没有值为零的字符,则printf()调用具有未定义的行为。

也不是fread()通常假定文件也打开二进制阅读以及。您的open()语句不以二进制模式打开文件。

0

的另一个问题是:

您写道:

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

优先进入乘法,所以它相当于:

malloc(input_file_size + (sizeof(char)); 

您应该添加括号。