在IOS app中,用C ++编写的模块我正在将我的数据(基本字符串和整数的映射)写入文本文件。使用以下方法:
bool Recognizer::saveMap(const char * s)
{
if(trainingData.model && !trainingData.model.empty()) {
const string filename = string(s);
std::ofstream file(s, ios_base::trunc );
try{
if(! file.is_open())
{
file.open(s);
}
for (map<String,int>::iterator it=trainingData.idMap.begin(); it!=trainingData.idMap.end(); ++it)
{
cout << it->second << " " << it->first << endl;
file << it->first << endl << it->second << endl;
}
file.close();
}
catch(cv::Exception & e){
if(file.is_open())
file.close();
int code = e.code;
string message = e.err;
cerr << "cv::Exeption code: " << code << " " << message << endl;
return false;
}
std::streampos fileLength = iosFileSize(s);
cout << "Saved map to: " << filename << " length: " << fileLength << endl;
return true;
}
return false;
}
我的包含一个条目和控制台输出表示两行:字符串,表示编号的字符串已写入我的文件。 使用getline或使用stream运算符进行读取和读取的后续打开文件表示该文件为空:
bool Recognizer::loadMap(const char * s)
{
std::streampos fileLenght = iosFileSize(s);
std::ifstream file(s, ios::in);
try{
if(file.is_open())
{
string name;
string lineName;
string lineTag;
int tag;
int count = 0;
while(getline(file,name))
{
if(getline(file,lineTag))
{
tag = stoi(lineTag,0,10);
count++;
cout << tag << " " << name << endl;
trainingData.idMap[name]=tag;
trainingData.namesMap[tag]=name;
}
}trainingData.personsCount=count;
file.close();
}
}
catch(cv::Exception & e){
if(file.is_open())
file.close();
int code = e.code;
string message = e.err;
cerr << "cv::Exeption code: " << code << " " << message << endl;
return false;
}
cout << "Loaded map from: " << s << " lenght: "<< fileLenght << endl;
return true;
}
我还从stackoverflow answers方法中复制了一个返回文件lenght并在写操作后用它来验证文件的长度:
std::streampos iosFileSize( const char* filePath ){
std::streampos fsize = 0;
std::ifstream file( filePath, std::ios::binary );
fsize = file.tellg();
file.seekg( 0, std::ios::end );
fsize = file.tellg() - fsize;
file.close();
return fsize;
}
传递给saveMap和loadMap的文件路径似乎是合法的。使用应用程序无法写入的路径,尝试写入导致的异常。
写入操作没有返回任何错误,但两者都尝试读取,iosFileSize()表示该文件为空。 我不确定是否需要调用file.open()和file.close()或文件在创建输出流并且稍后超出范围时自动打开和关闭。 我尝试了那些具有相同结果的(调用file.is_open返回true,因此跳过调用file.open()的块。
我做错了什么? 我感谢所有回复。
答案 0 :(得分:1)
在写入文件流后,您似乎不会在file.flush();
中的任何位置调用Recognizer::saveMap()
。 std::ofstream::flush()
保存您对文件所做的更改。在更改代码和关闭文件之间添加file.flush();
。看看这是否可以解决您的问题。
答案 1 :(得分:-1)
我相信,在第二个程序中打开文件时,查看代码是否覆盖了数据,你应该使用类似的东西。
std::fstream fs;
fs.open ("test.txt", ios::app)
而不是执行ios :: in