0

我编写了一个函数,使用stdio.h返回文件内容(文本或 html)的 C 标头。任何人都可以通过它并建议我是否有效地完成了内存管理。我会很高兴听到更好的建议来改进我的代码。

char *getFileContent(const char *filePath)
{   
//Prepare read file
FILE *pReadFile;
long bufferReadSize;
char *bufferReadFileHtml;
size_t readFileSize;
char readFilePath[50];
sprintf_s(readFilePath, "%s", filePath);
pReadFile = fopen (readFilePath, "rb");

if (pReadFile != NULL)
{
    // Get file size.
    fseek (pReadFile , 0 , SEEK_END);
    bufferReadSize = ftell (pReadFile);
    rewind (pReadFile);

    // Allocate RAM to contain the whole file:
    bufferReadFileHtml = (char*) malloc (sizeof(char) * bufferReadSize);

    if (bufferReadFileHtml != NULL) 
    {
        // Copy the file into the buffer:
        readFileSize = fread (bufferReadFileHtml, sizeof(char), bufferReadSize, pReadFile);

        if (readFileSize == bufferReadSize) 
        {
            return bufferReadFileHtml;
        } else {
            char errorBuffer[50];
            sprintf_s(errorBuffer, "Error! Buffer overflow for file: %s", readFilePath);
        }
    } else {
        char errorBuffer[50];
        sprintf_s(errorBuffer, "Error! Insufficient RAM for file: %s", readFilePath);
    }

    fclose (pReadFile);
    free (bufferReadFileHtml);
} else {
    char errorBuffer[50];
    sprintf_s(errorBuffer, "Error! Unable to open file: %s", readFilePath);
}
}
4

2 回答 2

0

这看起来像一个 C 程序,而不是 C++ 程序。虽然它将使用大多数 C++ 编译器进行编译,但它没有利用任何 C++ 特性(例如 new/new[]、delete/delete[]、显式转换、流运算符、字符串、nullptr 等)

您的代码几乎看起来像一个安全的 C 函数,尽管我认为这sprintf_s是一个仅限 Microsoft 的函数,因此可能不会使用 GCC、Clang、Intel 等进行编译,因为它不是标准的一部分。

您的函数还应该始终返回一个值。打开编译器警告以捕捉这些事情;他们使调试更容易:)

于 2013-09-15T05:12:42.737 回答
0

在不知道如何使用您创建的缓冲区的情况下,没有什么可说的。以下是一些可能的考虑因素:

1)当您将文件读入缓冲区时,您的处理器对此程序没有做任何其他事情。并行阅读并开始分析已阅读的部分可能会更好。

2)如果您需要真正快速高效的低内存文件 IO,请考虑将您的程序转换为状态机并完全忘记缓冲区。

3) 如果你真的没有一个要求很高的应用程序,那么你用 C 编写是在自杀。C#、python 等——几乎任何其他语言都有更好的字符串操作库。

顺便说一句,正如其他人所指出的那样,您应该使用 snprintf 来实现可移植性和安全性。

于 2013-09-15T06:43:41.750 回答