我编写了一个函数,使用返回文件内容(文本或html)的C头stdio.h
。任何人都可以通过它,并建议我是否有效地完成了内存管理。我会很高兴听到更好的建议,我可以改进我的代码。
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);
}
}
答案 0 :(得分:0)
这看起来像是C程序,而不是C ++程序。虽然它将使用大多数C ++编译器进行编译,但它没有利用任何C ++功能(例如new / new [],delete / delete [],显式转换,流操作符,字符串,nullptr等。)
您的代码几乎看起来像一个安全的C函数,虽然我认为sprintf_s
是一个仅限Microsoft的函数,因此可能无法使用GCC,Clang,Intel等进行编译,因为它不是标准的一部分。
您的函数也应始终返回值。打开编译器警告以捕获这些事情;他们使调试变得更容易:)
答案 1 :(得分:0)
如果不知道如何使用你创建的缓冲区,那就没什么可说的了。以下是一些可能的考虑因素:
1)当您将文件读入缓冲区时,您的处理器对此程序没有任何其他操作。最好是并行读取并开始分析已读取的部分。
2)如果您需要真正快速高效的低内存文件IO,请考虑将程序转换为状态机并完全忘记缓冲区。
3)如果你真的没有一个非常苛刻的应用程序,你就是用C. C#,python等编写来自杀 - 几乎任何其他语言都有更好的字符串操作库。
不过,正如其他人所指出的那样,你应该使用snprintf来提高便携性和安全性。