显然成功写入后,IOS文本文件为空

时间:2016-08-30 01:53:02

标签: c++ ios

在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()的块。

我做错了什么? 我感谢所有回复。

2 个答案:

答案 0 :(得分:1)

在写入文件流后,您似乎不会在file.flush();中的任何位置调用Recognizer::saveMap()std::ofstream::flush()保存您对文件所做的更改。在更改代码和关闭文件之间添加file.flush();。看看这是否可以解决您的问题。

答案 1 :(得分:-1)

我相信,在第二个程序中打开文件时,查看代码是否覆盖了数据,你应该使用类似的东西。

std::fstream fs;
  fs.open ("test.txt", ios::app)

而不是执行ios :: in