所以我有一个文件,作为一些文本,我希望我的函数读取该文件并将其存储在数组中。我做了一些代码,当我打印我的动态数组时,它会打印垃圾值:<帮助。>
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));
您应该添加括号。