读取函数内的文件,并且必须在使用C

时间:2015-04-24 04:35:20

标签: c

我正在尝试读取函数内部的文件,并希望它在返回后传递给函数的参数中的内容。

#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在主函数中包含文件的内容。

2 个答案:

答案 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 charuint8_t而不是<stdint.h>,这可能会签名。)

如果您知道缓冲区的长度(您可以使用),则可以使用char复制缓冲区。

您没有免费memcpy。实际上不需要分配本地缓冲区然后复制到输出。您可以直接读取传递的缓冲区。在任何情况下,您都应该确保文件内容适合缓冲区,可能将缓冲区维度作为第二个参数传递。

如果返回缓冲区中的字符数,该函数也会更有用。 (或者缓冲区中的字符已经足够大,buffer样式。)

请来,这是2015年:不要使用K&amp; R风格的功能签名。