SFML从TXT文件加载图片至std::vector仅加载最后一张图
问题分析与解决方案
看起来你遇到的核心问题是文件名读取逻辑和你的txt文件格式不匹配,导致最终只加载了最后一张图片,下面详细拆解并给出解决办法:
问题根源
你的images.txt里所有文件名是用空格分隔在同一行的,但你用getline()读取整行内容,这就导致filename向量里只存了一个元素——那整串包含所有文件名的字符串,而不是6个独立的文件名。后续加载图片时,你大概率是在处理这个字符串时只拿到了最后一个文件名,所以最终只加载了最后一张图。
另外还要提一句:你原代码里的while (!(file.eof()))是个常见坑,它会导致循环多执行一次(读取到空字符串),推荐用while (getline(file, TmpString))来替代,因为getline会返回流对象,当读取失败(比如到文件末尾)时,流会转为false,循环自然终止。
两种解决思路
思路1:修改代码,按空格分割读取到的整行内容
不需要改动txt文件,直接在代码里把读取到的整行字符串按空格拆分,提取每个文件名:
#include <sstream> // 需要包含这个头文件来用istringstream std::ifstream file("images.txt"); std::string TmpString; std::vector<std::string> filename; // 先读取整行内容 if (getline(file, TmpString)) { std::istringstream iss(TmpString); std::string fname; // 按空格分割,逐个提取文件名 while (iss >> fname) { filename.push_back(fname); } }
这样filename向量里就会有6个独立的文件名,后续加载图片的逻辑就能正常遍历每个文件了。
思路2:修改txt文件格式,让每个文件名单独占一行
把你的images.txt改成每行一个文件名:
1.png 2.png 3.png 4.png 5.png 6.png
然后修正原代码的循环判断逻辑:
std::ifstream file("images.txt"); std::string TmpString; std::vector<std::string> filename; // 正确的循环方式,避免eof()的问题 while (getline(file, TmpString)) { filename.push_back(TmpString); }
这样原有的加载逻辑就能正确读取到6个文件名,加载所有图片了。
内容的提问来源于stack exchange,提问作者ArmenHeat
相关产品推荐
相关产品推荐

