ofstream не открывается и не пишет в файлы - PullRequest
1 голос
/ 01 ноября 2011

Я смотрю на это часами и знаю, что ответ прост. Кажется, что бы я ни делал, я не могу открыть файл. Это многоклассовая программа, поэтому в шапке у меня есть

#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()
}

Я играл с флагами на конструкторах, а также с открытыми командами. И однажды ему удалось открыть файл, но он ничего не записал в файл. Если у вас есть какие-либо идеи, я буду очень признателен.

редактировать

Спасибо за помощь, ребята, похоже, я пытался открыть файл с помощью "". Но даже сейчас, после того, как я это исправлю, мой код не пишет в этот открытый файл. Я проверил свои права и я делаю 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 ]

4 голосов
/ 01 ноября 2011

Наиболее очевидная проблема заключается в том, что вы открываете файл несколько раз. Каждый экземпляр открытого файла будет иметь свою собственную позицию файла и его собственный буфер. Кроме того, в зависимости от системы, либо все открытые, но первый не удастся (я думаю, что Windows), или открытое будет усекать файл, эффективно стирая любую информацию, которая могла быть записана к этому. Что вы должны сделать, это PrintToFile передать открытый поток функции, которые он вызывает (рекурсивно); каждая из этих функций должна возьмите std::ostream& ( не std::ofstream&), чтобы получить его.

0 голосов
/ 01 ноября 2011

Я бы использовал простой, если:

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();

Таким образом, вы можете быть уверены, что файл был успешно открыт или нет.

0 голосов
/ 01 ноября 2011

Я вижу, что вы открываете файл несколько раз.Может быть, это вызовет проблемы.Сначала вы открываете его в PrintToFile, затем, пока он еще открыт, вы открываете его для добавления в PrintBase.Затем, пока в PrintBase вы снова открываете его при вызове PrintNext.

Поместите ofstream в качестве члена класса, откройте его один раз и обратитесь к нему из всех трех функций.

...