2016-11-15 77 views
-2

一个奇怪的事情时,我尝试在输出文件写入没有发生写作:输出文件C++

int main(int argc, char* argv[]) 
{ 


    std::string outputFile = "fitness.out"; 
    ofstream output(outputFile.c_str()); 


    FitnessFactory fitnessFactory; 

    //if i write on file here it's ok 

    vector<string> params; 
    params[0]= 10; 
    params[1]=120; 

    //if i write on file here not ok, file empty 

    Strategy* strategy = fitnessFactory.getStrategy("OneMax", params); 
    vector<string> individual; 


for(unsigned i = 0; i < argc-1; i++){ 

string inputFile = argv[i+1]; 
ifstream input(inputFile.c_str()); 
while(input.good()) 
{ 
    string temp; 
    input>>temp; 
    individual.push_back(temp); 
} 
input.close(); 
// if i write on file, before call strategy->evaluate,for example 
// output << "hello"<<endl; 
// file contains "hello" 
string res = strategy->evaluate(individual); 
//if i write here file is empty 
//output<< res << endl; 
} 

其他CPP文件分别是:

factoryMethod.cpp

 #include <stdio.h> 
#include "strategy.cpp" 
using namespace std; 
class factoryMethod 
{ 

public: 
    virtual Strategy* getStrategy(string x, vector<string> params) = 0; 


}; 

Strategy* factoryMethod :: getStrategy(string x, vector<string> 
params) 
{ 
} 


class FitnessFactory : public factoryMethod 
{ 
public: 
     Strategy* getStrategy(string x, vector<string> params) { 

     Strategy* s; 

      if(x=="OneMax") 
      s = new OneMax(); 
      else if (x=="Weierstrass") s = new Weiestrass(); 
      return s; 
     } 
}; 

策略.cpp

std::string Convert (float number){ 
std::ostringstream buff; 
buff<<number; 
return buff.str(); 
} 

class Strategy 
{ 
public: 
    virtual string evaluate(vector<string> v) = 0; 
    virtual void strategy(vector<string> params); 
public: vector<string> fparams; 
}; 

string Strategy :: evaluate(vector<string> v) 
{ 

} 

void Strategy :: strategy(vector<string> v){ 
fparams = v; 
} 

class OneMax : public Strategy 
{ 
public: 
     string evaluate(vector<string> v) { 
      string x = v[0]; 
     int count = 0; 
for (int i = 0; i < x.size(); i++) 
     if (x[i] == '1') count = count + 1; 

      string ret = static_cast<ostringstream*>(& 
(ostringstream() << count))->str(); 
      return ret; 
     } 
}; 
class Weiestrass: public Strategy 
{ 
public: 
    string evaluate(vector<string> v) { 
    // int repetitions = atoi(fparams[0].c_str()); 
// int iterations = atoi(fparams[1].c_str()); 
int repetitions = 10; 
int iterations = 120; 
vector<float> x; 
for(int i = 0; i < v.size(); i++){ 
    float temp = ::atof(v[i].c_str()); 
    x[i] = temp; 
} 
float fRes=0, fSum, b=2, h=0.5; 

for (int j = 0; j < repetitions; j++) 
{ 

     fRes = 0; 
     for (int i = 0; i < x.size(); i++) 
    { 
      fSum=0; 
      for (int k = 0; k < iterations; k++) fSum += pow(b,-  
(float)k*h) * sin(pow(b,(float)k)*x[i]); 
      fRes += abs(fSum); 
     } 
} 

string s = Convert(fRes); 
return s; 
} 
}; 

因此w如果我试图在调用之后编写函数的结果或任何其他值来评估文件是空白的。 我不明白为什么?? !!

+0

'的std :: VECTOR'没有元素开始,所以'PARAMS [0] = ...'不正确。相反,'params.push_back(...)'。 – crashmstr

+0

另外,学习如何在调试器中逐步执行程序。这应该可以帮助您找到并解决问题。 – crashmstr

+0

为什么在其他.cpp文件中包含.cpp文件?阅读关于头文件。为什么使用C头文件像'stdio.h'? –

回答

1
vector<string> params; 
params[0]= 10; 
params[1]=120; 

编号std::vector::operator[]()不会增加您内部的元素数量。要么vector<string> params(2);上创建结构,params.resize(2) 2个元素来创建分配前2个元素,或

params.push_back("10"); 
params.push_back("120");