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;       
}    

您将文件的内容读入字符数组。 此时,您还没有字符串,而是一个字符数组,因为末尾没有终止空字节。

然后使用 printf 打印此数组时,它会读取已分配内存段末尾的未初始化字节(以及可能在其后读取不属于已分配内存的几个字节(。 读取未初始化的字节会调用未定义的行为。

由于调用 fread 不会在读取的内容后添加终止空字节,因此您需要自己执行此操作:

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

问题就在违规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()语句不会以二进制模式打开文件。

另一个问题是:

你写道:

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

优先级是乘法,因此它等效于:

malloc(input_file_size + (sizeof(char)); 

您应该添加括号。

相关内容

  • 没有找到相关文章

最新更新