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 関数のように見えますが、Microsoft のみの関数だと思いますsprintf_s。標準の一部ではないため、おそらく GCC、Clang、Intel などを使用してコンパイルすることはできません。

また、関数は常に値を返す必要があります。これらの種類のものをキャッチするには、コンパイラの警告をオンにします。デバッグがずっと簡単になります:)

于 2013-09-15T05:12:42.737 に答える