每次调用 fgetc() 时,都会将内部文件指针前进一个字符。在您的 while() 循环结束时,文件指针将位于文件的末尾。意图读取文件句柄的后续调用将因 EOF 条件而失败。
fgets 手册说:
如果在尝试读取字符时遇到文件结尾,则设置 eof 指示符 (feof)。如果这发生在可以读取任何字符之前,则返回的指针是空指针(并且 str 的内容保持不变)。
结果是 tmp_str 保持不变。调用 printf 时返回的垃圾实际上是 conc() 函数堆栈的一部分。
解决您的问题的方法是在调用 fgets() 之前使用 fseek() 倒带文件指针。
fseek(source, 0, SEEK_SET);
那么获取文件大小的更好方法是 fseek 到文件末尾,并使用 ftell 获取当前位置:
long size;
fseek(source, 0, SEEK_END);
size = ftell(source);
话虽如此,您的代码仍然存在问题。当您在堆栈上分配(函数本地的变量)时,您必须在编译时告诉变量的大小。在这里,您的编译器分配了一个长度为 0 的 char 数组。如果您使用 C++ 编码,我建议您使用关键字new的malloc调查动态分配。
正确的分配如下所示:
char *tmp_str = malloc(size);
// Here you read the file
free(tmp_str);
一个更简单的解决方案可能是预先分配一个足够大的字符串来保存您的文件。
char tmp_str[1024 * 100]; // 100Kb
然后使用我们之前得到的大小变量在读取之前检查文件是否适合 tmp_str。