我正在尝试读取函数内部的文件,并希望它在返回后传递给函数的参数中的内容。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
char dest[10000];
copyString(dest);
printf("%s", dest);
}
copyString(outStr)
char *outStr;
{
char * buffer = 0;
long length;
FILE * f = fopen ("file.txt", "rb");
if (f)
{
fseek (f, 0, SEEK_END);
length = ftell (f);
fseek (f, 0, SEEK_SET);
buffer = (char *)malloc (length);
if (buffer)
{
fread (buffer, 1, length, f);
}
fclose (f);
}
strcpy(outStr, buffer);
}
当我尝试上述内容时,它不会打印任何内容。我的代码有什么问题?请帮忙。我希望dest在主函数中包含文件的内容。
答案 0 :(得分:0)
它对我有用。我有两个建议。
确保您的file.txt位于同一目录中。
您可以添加&#34; else&#34; if(f)条件的子句,并在else中说perror(&#34; open&#34;)。
另外,让你的文件很小。 (先说一行开头)。您没有测试strcpy上的缓冲区溢出。你应该使用strncpy。
答案 1 :(得分:0)
您不会使用空字符buffer
终止'\0'
。来自str*
的{{1}}函数对以null结尾的字符串进行操作。
您打开文件i二进制模式<string.h>
。如果您的数据是二进制,则可能包含零,并且打印将停止。 (如果您正在阅读二进制数据,请考虑使用"rb"
中的unsigned char
或uint8_t
而不是<stdint.h>
,这可能会签名。)
如果您知道缓冲区的长度(您可以使用),则可以使用char
复制缓冲区。
您没有免费memcpy
。实际上不需要分配本地缓冲区然后复制到输出。您可以直接读取传递的缓冲区。在任何情况下,您都应该确保文件内容适合缓冲区,可能将缓冲区维度作为第二个参数传递。
如果返回缓冲区中的字符数,该函数也会更有用。 (或者缓冲区中的字符已经足够大,buffer
样式。)
请来,这是2015年:不要使用K&amp; R风格的功能签名。