我正在尝试显示来自不同位置的图像。有汽车,飞机,椅子等文件需要显示。我把这些单词(汽车、飞机)放在一个文本文件中。我能读单词,但当我把它们放在sprintf中时,我会得到一些无意义的字符。我可以用cout<<*j<<endl;
显示单词。但cout<<filename<<endl;
给了我一个奇怪的结果。
string words;
std::vector<string>list;
fstream file;
file.open("h.txt");
while(!file.eof())
{
file >> words;
list.push_back(words);
}
for(vector<string>::iterator j=list.begin(); j!=list.end(); j++)
{
cout<<*j<<endl;
for(i=1; i<5; i++)
{
sprintf( filename,"D:\101_ObjectCategories\%s\image_%04d.jpg",*j,i);
cout<<filename<<endl;
C函数sprintf()
忽略了C++类。如果你真的想用sprintf()
打印std::string
,你需要提取一个C字符串:
sprintf(filename, "D:\101_ObjectCategories\%s\image_%04d.jpg", j->c_str(), i);
您还应该将snprintf()
与作为filename
传递的缓冲区大小一起使用,以防止溢出。就我个人而言,我不会真的麻烦,而是首先使用std::ostringstream
:
std::ostringstream out;
out << "D:\101_ObjectCategories\" << *j << "\image_"
<< std::setfill('0') << std::setw(4) << i << ".jpg";
std::string filename = out.str();
(包括<sstream>
和<iomanip>
之后)。
使用必须使用*j.c_str():
sprintf( filename,"D:\101_ObjectCategories\%s\image_%04d.jpg",*j.c_str(),i);
否则,字符串类本身会显式地转换为char*,这当然是垃圾:)