gpt4 book ai didi

c++ - ofstream 无法打开或写入文件

转载 作者:行者123 更新时间:2023-11-30 02:07:21 28 4
gpt4 key购买 nike

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

#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。显然我有一个数据结构和其他东西支持它,但我只需要把它写下来。提前致谢

最佳答案

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

关于c++ - ofstream 无法打开或写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com