【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )
文章目录
一、文件读取
使用 fopen 函数读取文件 , 然后将磁盘中的文件读取到内存中 ;
首先使用 fopen 函数打开文件 , 这里注意尽量使用绝对路径 , 在 Visual Studio 2019 中使用相对路径可能打开失败 ;
// 打开文件
FILE* pFile = fopen(filePath, "rb");
然后使用 fseek 函数获取当前的文件大小 ;
// 判定文件大小, 将文件指针从 "尾部" 开始移动
// 移动 0 个字节
// 成功返回 0 , 失败返回非 0
fseek(pFile, 0, SEEK_END);
最后调用 fread 函数将文件内容读取到数组中 ;
// 读取 pFile 指针指向的内存中的数据
// 读取的数据个数是 nLen 个
// 每个数据的大小是 sizeof(unsigned char) 字节 , 即 1 字节
// 将读取的数据存储到 fileContent 指向的内存中
fread(fileContent, sizeof(unsigned char), nLen, pFile);
代码示例 :
#include "utils.h"
// 加载文件方法
unsigned char* LoadFileContent(const char* filePath)
{
// 该指针指向的内存空间存储文件内容
unsigned char* fileContent = nullptr;
// 打开文件
FILE* pFile = fopen(filePath, "rb");
//printf("打开文件 pFile : %p", pFile);
// 如果打开文件成功
if (pFile)
{
// 判定文件大小, 将文件指针从 "尾部" 开始移动
// 移动 0 个字节
// 成功返回 0 , 失败返回非 0
fseek(pFile, 0, SEEK_END);
// 获取文件指针位置 , 当前文件指针位于文件尾部
// 当前的文件指针位置就是文件的字节长度
int nLen = ftell(pFile);
// 如果文件长度大于 0 , 才去读取文件
if (nLen > 0)
{
// 将文件指针 FILE* pFile 移到文件的开始位置
rewind(pFile);
// 为文件内容分配一块内存空间 , 即创建一个 nLen + 1 字节的数组
// 多出一个字节 , 在字节末尾添加一个 '\0'
fileContent = new unsigned char[nLen + 1];
// 读取 pFile 指针指向的内存中的数据
// 读取的数据个数是 nLen 个
// 每个数据的大小是 sizeof(unsigned char) 字节 , 即 1 字节
// 将读取的数据存储到 fileContent 指向的内存中
fread(fileContent, sizeof(unsigned char), nLen, pFile);
// 最后第 nLen + 1 个元素 , 索引是 nLen , 设置为 '\0'
fileContent[nLen] = '\0';
}
// 关闭文件
fclose(pFile);
}
return fileContent;
}
调用上述读取文件方法 , 并将读取的内容打印出来 :
// 读取文件内容
// 绝对路径 : "D:\\002_Project\\006_Visual_Studio\\OpenGL\\OpenGL\\test.txt"
// Visual Studio 2019 中使用相对路径读取不到文件
char* str = (char*)LoadFileContent("D:\\002_Project\\006_Visual_Studio\\OpenGL\\OpenGL\\test.txt");
printf("%s\n", str);
上述 “D:\002_Project\006_Visual_Studio\OpenGL\OpenGL\test.txt” 文件内容是 " Hello OpenGL "
二、报错处理 ( ‘fopen’: This function or variable may be unsafe. )
处理错误问题 :
1>------ 已启动生成: 项目: OpenGL, 配置: Debug Win32 ------
1>utils.cpp
1>D:\002_Project\006_Visual_Studio\OpenGL\OpenGL\OpenGL\utils.cpp(10,1): error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\stdio.h(208): message : 参见“fopen”的声明
1>已完成生成项目“OpenGL.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
处理方案 : 命令行添加 " _CRT_SECURE_NO_WARNINGS " 宏 , 右键点击项目名称 , 选择属性 ,
选择 配置属性 / C/C++ / 命令行 , 设置如下宏 :
/D_CRT_SECURE_NO_WARNINGS
三、桌面程序添加控制台窗口
桌面程序添加控制台窗口 : 右键点击项目名称 , 选择 " 属性 " ;
在 " 配置属性 / 生成事件 / 生成后事件 " 中的 " 命令行 " 输入框中输入如下内容 ;
editbin /subsystem:console $(OutDir)$(ProjectName).exe
运行程序 : 成功读取到本目录下的 “test.txt” 文件 , 这里有个问题需要注意 , 在 Visual Studio 2019 中使用相对路径读取不到文件 , 必须使用绝对路径才可以 ;
// 读取文件内容
// 绝对路径 : "D:\\002_Project\\006_Visual_Studio\\OpenGL\\OpenGL\\test.txt"
// Visual Studio 2019 中使用相对路径读取不到文件
char* str = (char*)LoadFileContent("D:\\002_Project\\006_Visual_Studio\\OpenGL\\OpenGL\\test.txt");
printf("%s\n", str);
四、相关资源
GitHub 地址 : https://github.com/han1202012/OpenGL ( GitHub 源码始终都会随着后续博客的进度更新覆盖 , 可能没有本博客的相关源码 , 推荐下载博客源码快照 ) ;
博客源码快照 : https://download.csdn.net/download/han1202012/14930175 ( 该源码是 Windows 桌面程序 , 使用 Visual Studio 2019 打开 )
相关文章
- pycharmimport时找不到指定文件_pycharm系统找不到指定文件
- Snapde一个全新的CSV超大文件编辑软件
- Windows命令窗口输入命令报错不是内部或外部命令,也不是可运行的程序 或批处理文件
- WordPress程序文件功能介绍(WP程序开发必备)
- VB的32位程序在64位系统中出现文件和注册表自动转向的解决方法
- elf文件解析器_elf文件下载
- 解决:无法将“php”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
- Araxis Merge pro,文件对比合并同步工具
- 【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
- 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )
- Linux 下的套接字文件使用指南(套接字文件linux)
- 编译Linux C: 编译多个文件(linuxc多个文件)
- Linux C程序快速文件查找(linuxc文件查找)
- 里查找Oracle日志文件:从何处开始?(oracle日志文件在哪)
- MySQL数据库备份文件管理(mysqlbak文件)
- 文件安装MSSQL二进制文件安装指南(mssql二进制)
- 如何使用 GNU Stow 来管理从源代码安装的程序和点文件
- 从Windows向Linux传输文件的方法(如何将文件传到linux)
- 快速实现文件复制:Linux移动、拷贝与备份技巧(Linux复制某些文件)
- s文件Linux系统添加Hosts文件实现网络加速(linux加host)
- 文件解析 Linux 下.dat文件解析方法(linux.dat)
- Linux下分割文件的简单方法(分割文件linux)
- 利用批处理文件和vbs脚本实现网站视频自动录制
- 关于网站文件自动备份程序的一点思考
- 用.Net的File控件上传文件的解决方案
- asp.net中资源文件的使用
- 未能加载文件或程序集“AspNetPager”或它的某一个依赖项。拒绝访问
- 使用ajaxfileupload.js实现ajax上传文件php版