面试题答案
一键面试以下是实现安全文件打开和关闭操作的C代码示例,以及跨平台错误处理的说明:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
// 跨平台获取错误信息字符串
const char* get_error_message() {
#ifdef _WIN32
return strerror_s(errno);
#else
return strerror(errno);
#endif
}
// 安全的文件打开和关闭函数
FILE* safe_file_operation(const char* filename, const char* mode) {
FILE* file = fopen(filename, mode);
if (file == NULL) {
// 处理文件打开错误
const char* error_msg = get_error_message();
fprintf(stderr, "Error opening file %s: %s\n", filename, error_msg);
// 这里可以添加更多的异常处理逻辑,比如记录日志等
return NULL;
}
// 注册文件关闭函数,确保程序异常时文件能正确关闭
atexit([&file]() {
if (file != NULL) {
fclose(file);
}
});
return file;
}
跨平台错误处理说明
- 错误获取:在Windows下使用
strerror_s
获取错误信息,在非Windows系统下使用strerror
。 - 通用错误处理:无论在哪个平台,当
fopen
失败时,errno
会被设置为相应的错误码。通过上述get_error_message
函数获取错误信息字符串,并输出到标准错误流进行错误提示。 - 文件关闭处理:使用
atexit
函数注册一个函数,当程序正常退出或异常终止时,该函数会被调用,确保打开的文件被正确关闭。这样即使在程序出现异常(如内存分配失败等情况)时,文件资源也能正确释放。