ofstream无法打开或写入文件

时间:2011-11-01 17:35:54

标签: c++ ofstream

我一直在看这几个小时,我只知道答案很简单。似乎无论我做什么我都无法打开文件。这是一个多类程序,所以在标题中我有

#include <iostream>
#include < fstream>
class A{
  string path;

  A(string p): path(p){}
  ...
  ...
  void PrintToFile();
  void PrintBase();
  void PrintNext();
  ...
  ...
};

并且在cpp文件中我有

#include "A.h"

void A::PrintToFile(){

  ofstream f(path.c_str(), ios::out);
  assert(f.is_open);

  f << "markuptext" << endl;
  PrintBase();
  f << "endtag" << endl;
  f.close();
}


void A::PrintBase(){

  ofstream f(path.c_str(), ios::app);
  assert(f.is_open);

  f << "markuptext" << endl;
  f << somevale << endl;
   PrintNext();
  f << "endtag" << endl;
  f.close()
}

void A::PrintNext(){

  ofstream f (path.c_str(), ios::app);
  assert(f.is_open);

  f << "markuptext" << endl;
  f << somevalue << endl;
  f << "endtag" << endl;
  f.close()
}

我已经使用了构造函数上的标志和open命令。一旦它设法打开一个文件,但它从未向文件写过任何内容。如果您有任何见解我会非常感激。

编辑

感谢所有帮助人员,看起来我正试图用“”打开一个文件。但是即使现在我已经理顺了,我的代码也没有写入那个打开的文件。我检查了我的权限,我正在做chmod a + rwx ...这里的代码更详细。

#ifndef XML_WRITER_H
#define XML_WRITER_H

#include "WordIndex.h"
#include "PageIndex.h"
#include "StringUtil.h"
#include "CS240Exception.h"
#include <iostream>
#include <fstream>



/* prints out the wordIndex to an xml file
*/

class XMLWriter{
private:
    WordIndex * wIndex;
    PageIndex * pIndex;
    URL baseurl;
    //const char * file;
    ofstream f;
public:

  XMLWriter();
  XMLWriter(string base);
  XMLWriter(XMLWriter & other){
      assert(&other != NULL);
      Init(other);
  }
  XMLWriter & operator =(XMLWriter & other){
      Free();
      Init(other);
  }
  ~XMLWriter(){
      Free();
  }

  void Load(WordIndex & wi, PageIndex & pi);


  //prints to the file
  void Print(char * ofile);

private:
  void Init(XMLWriter & other){
    baseurl = other.baseurl;
    wIndex = other.wIndex;
    pIndex = other.pIndex;

  }
  void Free(){
  }

  void PrintWebsite();
  void PrintStartURL();
  void PrintPages();
  void PrintIndex();
  void PrintWord(OccurenceSet ocs);
  void PrintValue(string s);
  void PrintOccurence(Occurence o);
  void PrintPage(Page & page );
  void PrintDescription(string dscrptn );
  void PrintValue(int n );
  void PrintURL(URL url );

};
#endif

.cpp文件

#include "XMLWriter.h"

XMLWriter::XMLWriter(){
}

XMLWriter::XMLWriter( string base): baseurl(base){
//cout << "filename : " << filename << endl;
//file =  filename.c_str();
//cout << "file : " << *file << endl;
}


void XMLWriter::Load(WordIndex & wi, PageIndex & pi){
wIndex = &wi;
pIndex = &pi;
wIndex->ResetIterator();
pIndex->ResetIterator();
}


void XMLWriter::Print(char * filename){

    cout << filename << endl;
    ofstream f(filename);
    if(!f){
      cout << "file : " << filename;
      throw CS240Exception("could not open the file for writing");
    }
    PrintWebsite();
    f.close();

}
//private methods
//
void XMLWriter::PrintWebsite(){


    f <<"<website>\n";
    PrintStartURL();
    PrintPages();
    PrintIndex();
    f << "</website>" << endl;
}

// startURL
//
void XMLWriter::PrintStartURL( ){

    f << "\t" << "<start-url>"<< endl;
    string val = baseurl.Value();
    StringUtil::EncodeToXml(val);
    f << "\t\t" << val << endl;
    f << "\t" << "</start-url>"<< endl;


}

//pages
//
void XMLWriter::PrintPages(){

    f << "\t" << "<pages>"<< "\n";
    while(pIndex->HasNext())
    PrintPage(*(pIndex->Next()));
    f << "\t" <<"</pages>"<<  '\n';

}
void XMLWriter::PrintPage(Page & page ){

    f << "\t\t" <<"<page>"<< endl;
    PrintURL(page.Value());
    PrintDescription(page.Description() );
    f << "\t\t" <<"</page>"<< endl;
}
void XMLWriter::PrintURL(URL url){
    f << "\t\t\t<url>"<< endl;
    f << "\t\t\t\t" << StringUtil::EncodeToXmlCopy(url.Value()) << endl;
    f << "\t\t\t</url>"<< endl;

}
void XMLWriter::PrintDescription(string dscrptn){
    f << "\t\t\t<description>";
    f << StringUtil::EncodeToXmlCopy(dscrptn);
    f << "</description>"<< endl;
}

//index
//
void XMLWriter::PrintIndex(){

    f << "\t<index>"<< endl;
    while(wIndex->HasNext())
        PrintWord(*(wIndex->Next()) );
    f << "\t</index>"<< endl;

}
void XMLWriter::PrintWord(OccurenceSet ocs ){
    f << "\t\t<word>" << endl;
    PrintValue(ocs.Value());
    ocs.ResetIterator();
    while(ocs.HasNext())
        PrintOccurence(*(ocs.Next()) );
    f << "\t\t</word>"<< endl;
}
void XMLWriter::PrintValue(string s ){
    f << "\t\t\t<value>";
    f << StringUtil::EncodeToXmlCopy(s);
    f << "</value>"<< endl;

}

void XMLWriter::PrintOccurence(Occurence o ){

    f << "\t\t\t<occurence>" << endl;
    PrintURL(o.Value()->Value());
    PrintValue(o.NumOfOccur());
    f << "<\t\t\t/occurence>"<< endl;

}
void XMLWriter::PrintValue(int n ){

    f << "\t\t\t\t<count>";
    f << n;
    f << "</count>"<< endl;
}

它不会写任何文件:(但现在它正在创建一个文件,所以这是一个步骤:-D。 显然我有一个数据结构和其他支持这一点的东西,但我只需要写它。提前致谢

3 个答案:

答案 0 :(得分:4)

最明显的问题是您要多次打开文件。 打开文件的每个实例都有自己的文件位置和它 拥有缓冲区。另外,根据系统,要么全部打开,要么 第一个会失败(Windows,我认为),或者open会截断 文件,有效地删除可能已写入的任何信息 它。你应该做的是让PrintToFile将开放流传递给 它调用的函数(递归);每个功能都应该 拿一个std::ostream& std::ofstream&)来接收它。

答案 1 :(得分:0)

我看到的一件事是您要多次打开文件。也许那会带来麻烦。你首先在PrintToFile中打开它,然后在它打开时打开它以便在PrintBase中追加。然后在PrintBase中,在PrintNext调用中再次打开它。

将ofstream作为类的成员,打开一次并从所有三个函数中引用它。

答案 2 :(得分:0)

我会使用简单的if:

ofstream f (path.c_str(), ios::app);
if(!f)
{
   throw std::exception(std::string("Could not open file : " + path + "for writing"));
}
//write to file here
f.close();

通过这种方式,您可以确定文件是否已成功打开。