C++ ifstream在读取文件3次后中断
我正在使用ifstream从.txt文件中提取值。我还使用windows库读取文件夹中的所有文件,即循环直到到达文件夹的末尾。在这个循环中,我从txt文件中读取值,并使用push_back将其添加到矩阵中 以下是有关守则的部分:C++ ifstream在读取文件3次后中断,c++,windows,opencv,vector,C++,Windows,Opencv,Vector,我正在使用ifstream从.txt文件中提取值。我还使用windows库读取文件夹中的所有文件,即循环直到到达文件夹的末尾。在这个循环中,我从txt文件中读取值,并使用push_back将其添加到矩阵中 以下是有关守则的部分: Mat trainme(0, dictionarySize, CV_32FC1); Mat labels(0, 1, CV_32FC1); //1d matrix with 32fc1 is requirement of normalbayesclassifier c
Mat trainme(0, dictionarySize, CV_32FC1);
Mat labels(0, 1, CV_32FC1); //1d matrix with 32fc1 is requirement of normalbayesclassifier class
hTrain = FindFirstFile(full_path, &TrainData);
if (hTrain != INVALID_HANDLE_VALUE)
{
ifstream file("c:\\222\\labels.txt");
string line;
do {
strcpy(loc,DirSpec);
Mat img = imread(strcat(loc,TrainData.cFileName), 0);
cout<<"Processing file: "<<TrainData.cFileName<<endl;
if (!img.data){
cout << "Image data not loaded properly: " <<TrainData.cFileName<< endl;
cin.get();
}
vector<KeyPoint> keypoints;
features->detect(img, keypoints);
if(keypoints.empty()) cout<<"Cannot find keypoints in image: "<<TrainData.cFileName<<endl;
Mat bowDescriptor;
bowDE.compute(img, keypoints, bowDescriptor);
trainme.push_back(bowDescriptor);
getline(file, line);
labels.push_back(line);
strcpy(loc,"");
} while( FindNextFile(hTrain,&TrainData));
}
我不明白为什么它失败了。我认为传输字符串格式可能有问题,所以我使用了float value=atofline,但这导致了一个错误,它无法从字符串格式转换,只能使用旧的c样式字符串
下面是labels.txt中包含的内容
1
2
2
2
1
2
2
2
谢谢你的关注
更新:我尝试将文件从主循环中移出,并使用whilefile.good,但在同一点上仍然出现相同的错误。我不知道为什么
string line;
ifstream file("c:\\222\\labels.txt");
if (file.is_open())
{
while (file.good() )
{
getline (file,line);
labels.push_back(line);
}
file.close();
}
好吧,我设法解决了=/ 问题就在这里:labels.push_backline 我认为使用push_-back将std::string添加到Mat是不可能的 我通过使用atof将字符串转换为float来解决这个问题
Mat类型的定义是什么?@phonetagger是opencv的函数,如cv::Mat中的函数
string line;
ifstream file("c:\\222\\labels.txt");
if (file.is_open())
{
while (file.good() )
{
getline (file,line);
labels.push_back(line);
}
file.close();
}
getline (file,line);
float label = atof(line.c_str());
labels.push_back(label);